我在Heroku上有一个Rails 3.2.6应用程序,有一个工作dyno用于延迟工作2.1.4。当我在本地运行一个worker时,不会出现问题。但是当我在Heroku上运行它时,它似乎会表现得不规律并且失败了。起初我认为这种模式与工作人员dyno旋转下来并重新启动有关,因为经过几次尝试后,工作再次开始工作。如果等待时间过长,则作业开始失败。但现在我不确定它是否与旋转有关,因为工作之间只有5分钟就会再次导致错误。但是,保持工作彼此接近似乎会增加成功执行的机会。
错误如下:
irb(main):052:0> Delayed::Job.last.last_error
Delayed::Backend::ActiveRecord::Job Load (9.9ms) SELECT `delayed_jobs`.* FROM `delayed_jobs` ORDER BY `delayed_jobs`.`id` DESC LIMIT 1
=> "{Job failed to load: uninitialized constant FacebookTimelinePublisher. ...
在这种情况下,FacebookTimelinePublisher
是app/publishers
目录中的PORO类,我已将其包含在自动加载路径中以进行安全措施。
感谢你提出的任何建议。
[UPDATE]
我改变了设置延迟作业的方式,使用Delayed::Job.enqueue
代替#delay
。现在已经将问题向前移动了,因为Delayed Job正确地找到了Job类,但是现在当它正在初始化时,它没有找到Rails模型。尽管如此,问题的“间歇性”仍然存在,因为有时候这项工作顺利完成。
"{Job failed to load: uninitialized constant ShareObject. Handler: \"--- !ruby/struct:FacebookTimelinePublisher \\nshare_object: !ruby/ActiveRecord:ShareObject \\n attributes: \\n ...."
答案 0 :(得分:0)
不确定Heroku环境,但我通过在初始化程序中要求自定义类解决了类似的问题(我使用了delayed_job配置初始化程序):
require "#{Rails.root}/app/publishers/facebook_timeline_publisher.rb"
答案 1 :(得分:0)
似乎问题与宝石版本有关。我升级到delayed_job 3.0.4并且还安装了delayed_job_active_record(0.3.3),所以我不确定这两个中哪一个修复了问题,但现在所有的工作都成功执行了。
希望这有助于某人。