Heroku上的延迟作业间歇性地失败并显示'未初始化的常量'

时间:2012-12-12 02:08:15

标签: ruby-on-rails ruby heroku delayed-job

我在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. ...

在这种情况下,FacebookTimelinePublisherapp/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  ...."

2 个答案:

答案 0 :(得分:0)

不确定Heroku环境,但我通过在初始化程序中要求自定义类解决了类似的问题(我使用了delayed_job配置初始化程序):

require "#{Rails.root}/app/publishers/facebook_timeline_publisher.rb"

另请参阅:Delayed::Job with modules

答案 1 :(得分:0)

似乎问题与宝石版本有关。我升级到delayed_job 3.0.4并且还安装了delayed_job_active_record(0.3.3),所以我不确定这两个中哪一个修复了问题,但现在所有的工作都成功执行了。

希望这有助于某人。