升级redis-rb至5.0.6后与Resque 1.27.4兼容报错,求解决方案
解决Resque 1.27.4与redis-rb 5.0.6类型校验冲突的方案
针对你遇到的TypeError: Unsupported command argument type: Resque::Worker错误,以下是无需升级Resque的可行解决办法:
方法1:为Resque::Worker添加to_s方法
redis-client会自动将Integer/Float/Symbol类型转为字符串,我们可以给Resque::Worker类补充to_s方法,让它符合类型转换规则。在Rails的初始化文件(比如config/initializers/resque.rb)中添加:
class Resque::Worker def to_s self.id # 或使用self.name,根据Resque Worker的实际属性选择合适的字符串标识 end end
这样当redis-client处理Resque::Worker实例时,会自动调用to_s转为合法字符串,不会触发类型错误。
方法2:包装Redis实例拦截并转换参数
通过装饰模式包装Redis实例,在调用Redis方法前自动将Resque::Worker对象转为字符串:
class RedisResqueWrapper def initialize(redis_instance) @redis = redis_instance end def method_missing(name, *args, &block) processed_args = args.map do |arg| arg.is_a?(Resque::Worker) ? arg.id.to_s : arg end @redis.send(name, *processed_args, &block) end def respond_to_missing?(name, include_private = false) @redis.respond_to?(name, include_private) || super end end # 替换原有的Redis初始化代码 Resque.redis = RedisResqueWrapper.new(Redis.new(creds))
该方法无需修改Resque或redis-client的源码,通过包装类统一处理参数转换,兼容性更强。
方法3:Monkey Patch redis-client的类型校验逻辑
直接修改redis-client的参数编码逻辑,添加Resque::Worker类型支持:
module RedisClient module CommandBuilder def self.encode_element(element) case element when String element when Integer, Float, Symbol, Resque::Worker element.to_s else raise TypeError, "Unsupported command argument type: #{element.class}" end end end end
注意:此方法依赖redis-client的内部实现,若后续升级redis-client可能需要同步调整,但当前0.14.0版本可正常使用。
内容的提问来源于stack exchange,提问作者HarshM
相关产品推荐
相关产品推荐

