You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:45:30