ActiveJob 5.2.0未异步执行任务,Resque配置异常求助
问题描述
我正在实现一个API端点,希望把请求加入队列后立即返回。使用的是ActiveJob 5.2.0版本(因历史原因无法升级)。
定义的任务类如下:
class Service::ExportBooks::Job < ActiveJob::Base def perform ## ... 执行任务逻辑 rescue StandardError binding.pry raise end end
在控制器中调用:
Service::ExportBooks::Job.perform_later
但任务会被同步执行,控制器甚至能接收到任务抛出的错误。我也试过另一种写法:
job = Service::ExportBooks::Job.new job.enqueue(wait: 5.seconds)
结果还是一样,任务没被加入队列,而是立即执行。
更新内容
发现Resque.inline?返回true,导致任务以同步方式执行。手动设置Resque.inline = false后,任务被加入队列,但并未执行。我已经用以下命令启动了worker:
QUEUE=* PIDFILE=./tmp/resque.pid bundle exec rake environment resque:work
解决方案
1. 全局关闭Resque同步模式
不要临时手动设置Resque.inline = false,直接在对应环境的配置文件(如config/environments/development.rb或production.rb)中添加永久配置:
Resque.inline = false
确保应用启动时就加载该配置,避免代码执行顺序导致临时设置失效。
2. 确认ActiveJob适配器配置
ActiveJob 5.2.0需要明确指定Resque作为队列适配器,在config/application.rb或对应环境配置文件中添加:
Rails.application.config.active_job.queue_adapter = :resque
3. 验证Worker与主应用的Redis连接一致性
任务入队但不执行,多数是Worker和主应用的Redis配置不匹配。检查:
- 查看
config/initializers/resque.rb中的Redis配置,确保Worker和主应用使用同一个Redis实例:Resque.redis = Redis.new(host: '你的Redis地址', port: 6379, db: 0) - 启动Worker时指定正确的环境,比如开发环境需加上
RAILS_ENV=development:QUEUE=* PIDFILE=./tmp/resque.pid RAILS_ENV=development bundle exec rake environment resque:work
4. 检查队列名称匹配
如果你的Job类指定了队列(如queue_as :export_books),启动Worker时可尝试显式指定该队列排查问题:
QUEUE=export_books PIDFILE=./tmp/resque.pid bundle exec rake environment resque:work
5. 查看日志排查错误
启动Worker时开启 verbose 模式查看日志,定位执行失败原因:
QUEUE=* PIDFILE=./tmp/resque.pid bundle exec rake environment resque:work VERBOSE=1
也可在Rails控制台中检查Redis队列是否存在任务:
# 进入rails console执行 Resque.size('default') # 替换为你的队列名称
内容的提问来源于stack exchange,提问作者Ward Clark
相关产品推荐
相关产品推荐

