0

我在 Heroku 上有一个 Rails 3.2.6 应用程序,有一个用于 Delayed Job 2.1.4 的工人测功机。当我在本地运行工人时,不会出现任何问题。但是当我在 Heroku 上运行它时,它似乎会表现得不规律,并导致一些工作失败。起初我认为这种模式与工人测功机旋转并重新启动有关,因为经过几次尝试,工作又开始工作了。如果等待时间过长,作业就会开始失败。但现在我不确定这与减速有关,因为作业之间仅 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中的目录中的 PORO 类。app/publishers

感谢您提出的任何建议。

[更新]

我已经更改了设置延迟作业以使用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  ...."
4

2 回答 2

0

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

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

参见:Delayed::Job with modules

于 2012-12-12T05:45:43.187 回答
0

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

希望这可以帮助某人。

于 2012-12-14T04:26:08.220 回答