Rails 5.2.4升级至6.1后Delayed Job任务入队但未被执行问题求助
排查步骤
- 第一步:校验队列名匹配性
Rails 6.1对ActiveJob队列名的处理逻辑有变更,首先在Rails控制台执行以下代码确认入队任务的实际队列名:
确认输出的队列名是否带有你配置的前缀# 随便创建一个测试任务入队 TestJob.perform_later # 查看最后一条入队任务的队列字段 puts Delayed::Job.last.queueukcil_development_,如果没有则说明queue_name_prefix配置未生效,检查配置加载优先级。 - 第二步:修正QUEUES通配符配置
delayed_job 4.1.9版本对QUEUES=*的通配符匹配规则做了调整,无法自动匹配带前缀的队列。你可以修改环境变量为带前缀的通配规则:
也可以启动时显式指定所有队列:QUEUES=ukcil_development_*bin/delayed_job --queues=mailers_h,mailers_l,general_h,general_l --queue-name-prefix=ukcil_development -n 1 start - 第三步:开启delayed_job详细日志排查
在config/initializers/delayed_job.rb中添加日志配置,输出worker的轮询细节:
重启worker后查看Delayed::Worker.logger = Logger.new(Rails.root.join('log', 'delayed_job.log')) Delayed::Worker.logger.level = Logger::DEBUG Delayed::Worker.raise_signal_exceptions = :termlog/delayed_job.log,确认worker是否在正常轮询队列,是否有任务匹配失败的相关日志。 - 第四步:检查delayed_job表结构完整性
跨版本升级delayed_job后需要执行升级迁移,避免字段缺失导致的静默读取失败:
执行完成后重启delayed_job进程验证任务是否正常执行。rails generate delayed_job:upgrade rails db:migrate - 第五步:校验任务执行时间配置
检查入队任务的run_at字段是否大于当前系统时间,同时确认没有配置Delayed::Worker.delay_jobs = false之类的全局跳过配置,也没有设置Delayed::Worker.max_run_time等参数把正常任务判定为超时。
内容的提问来源于stack exchange,提问作者Deep
相关产品推荐
相关产品推荐

