调用Sidekiq::Status.cancel取消任务时触发ArgumentError错误求助
问题:调用Sidekiq::Status.cancel取消任务时触发参数错误
尝试调用Sidekiq::Status.cancel(jid)取消Sidekiq任务时,出现以下错误:
ArgumentError: wrong number of arguments (given 4, expected 3)
错误来自redis-5.0.6的zrangebyscore方法,错误回溯指向sidekiq-status-1.1.4的storage.rb文件。
原因分析
从错误栈可以看出:
- 当前使用的
sidekiq-status版本是1.1.4,属于较老版本,其内部调用zrangebyscore时使用的是位置参数(比如zrangebyscore(key, min, max, offset, count)) - 而redis 5.x版本的
zrangebyscore方法已经将limit等参数改为关键字参数(定义为def zrangebyscore(key, min, max, withscores: false, with_scores: withscores, limit: nil)) - 两者参数传递方式不匹配,导致触发参数数量错误。
解决方案
方案1:降级Redis版本到兼容版本
将Redis版本降级到与sidekiq-status-1.1.4兼容的4.x系列,在Gemfile中指定:
gem 'redis', '~> 4.8.0'
执行以下命令更新依赖:
bundle install
方案2:升级Sidekiq-Status到兼容Redis 5.x的版本
查找并升级sidekiq-status到支持Redis 5.x的版本(建议至少升级到1.2.0及以上,需确认与当前Sidekiq 3.3.4的兼容性),在Gemfile中指定:
gem 'sidekiq-status', '~> 1.2.0' # 或更高兼容版本
执行以下命令更新依赖:
bundle install
注意:如果新版本
sidekiq-status不兼容Sidekiq 3.3.4,可能需要同步升级Sidekiq到对应兼容版本,这会涉及更多代码适配。
方案3:临时修改Gem源码(不推荐)
如果暂时无法升级/降级依赖,可以临时修改sidekiq-status的源码,调整zrangebyscore的调用方式:
- 找到
sidekiq-status-1.1.4/lib/sidekiq-status/storage.rb文件的schedule_batch方法 - 将原来的位置参数调用(类似
conn.zrangebyscore(scheduled_key, '-inf', job_unix_time, 0, 1000))改为关键字参数形式:
conn.zrangebyscore(scheduled_key, '-inf', job_unix_time, limit: [0, 1000])
此方法仅作为临时修复,后续执行
bundle update会覆盖修改,不建议长期使用。
验证
修改完成后,重新调用Sidekiq::Status.cancel(jid),确认错误消失,任务可正常取消。
内容的提问来源于stack exchange,提问作者Pranathi D
相关产品推荐
相关产品推荐

