我花了几天时间,大约 100 个小时,但无法修复。
这是我的设置(使用 Rails 4.2.8(
class CustomJob < ActiveJob::Base
def perform(*args)
filename = args.first
data = File.read(filename)
# process that data
end
end
当我运行Delayed::Job.enqueue CustomJob.new('filename')
时,我得到主题中提到的错误。 作业已创建并添加到数据库中,但错误消息为"作业失败...">
我有这样一行:
require 'custom_job'
在几个地方,包括script/delayed_job.rb
、config/initializers/delayed_jobs.rb
、config/initializers/custom_job.rb
和我调用作业的文件。
我还添加了这个:config.autoload_paths+=Dir[Rails.root.join('app','jobs')]
config.active_job.queue_adapter = :delayed_job
到我的config/application.rb
文件
而这个:
config.threadsafe! unless defined? ($rails_rake_task) && $rails_rake_task
每次更改后,我还重新启动了服务器。 并验证delayed_job是否正在运行:
dir$ RAILS_ENV=development script/delayed_job status
delayed_job: running [pid 64503]
来源:
- delayed_job作为守护程序运行时作业失败。使用耙子时运行良好 作业:工作
- 延迟作业:"作业加载失败:未初始化的常量 Syck::Syck">
- Rails 自定义延迟作业 - 未初始化的常量
- 使用线程安全时未在延迟作业中加载模型类
我总觉得答案是显而易见的......在我想通之后。
问题是我使用的是共享数据库,并且有现有的工作人员访问此数据库。 虽然我正在重新启动并刷新服务器的本地实例,但其他实例正在尝试运行我的作业,并且其他工作线程导致错误,而不是我的本地实例。
解决方案:确保其他delayed_job实例使用与要测试/生成/使用的代码相同的表。如果是这样,请尽可能使用另一个数据库。
您也可以尝试将此行添加到 config/application.rb 文件中吗?
config.eager_load_paths+=Dir[Rails.root.join('app','jobs')]