【发布时间】:2011-05-26 19:12:07
【问题描述】:
我正在使用 Rails 2 的延迟作业插件,每次我尝试修改模型并将其保存在延迟作业所需的“执行”方法中时,它都会失败(没有错误消息或任何东西,它只是在数据库中列为故障)。
我的一个 Rails 模型文件(视频)中有“执行”方法,并且我将该模型的一个实例(假设为@video)传递给 Delayed::Job.enqueue
您无法在队列中进行数据库修改是一个已知问题吗?我做错了什么吗(它只会在尝试保存时失败,而不是在我实际更改属性时失败,这听起来像是数据库修改问题)。
如果这是预期的:我该如何解决?我正在尝试将“完成”属性保存为 true,因此我知道模型何时准备好进入下一步。是否有一些标准方法可以确定延迟的工作何时完成?
编辑:我已经确认调用 perform Standalone(没有延迟工作)在保存方面没有问题(没有错误或警告,或任何东西)。当我通过 DelayedJobs 调用它时,它在到达保存行的第二秒立即失败(没有超时)。
编辑:等等,我想我知道发生了什么:我的“执行”是“after_create”回调的一部分......这一切都很好,直到我尝试保存。看起来当我保存时,它会再次调用 perform AGAIN (虽然已经在执行),并且不会与 Delayed Jobs 一起飞行(也不应该)。出于某种原因,我认为 after_create 只会被调用一次(而不是在每次保存之后)。等等,一个简单的测试表明情况确实如此。 hrrm... 那么为什么在延迟作业中执行时会在我保存时调用两次,而在我不保存时调用一次?
我的代码:
after_create :start_transcodes
def start_transcodes
Delayed::Job.enqueue self
end
def perform
puts "performing"
self.flash_status = 100
self.save!
puts "done"
end
我看到了什么:
performing
performing
2 jobs processed at 3.3406 j/s, 2 failed ...
我从来没有看到它说“完成”。
我在 Rails 日志中看到的是:
"* [JOB] Video failed with NameError: undefined local variable or method `flush_deletes' for #<Paperclip::Attachment:0xb6e51da0> - 2 failed attempts
undefined local variable or method `flush_deletes' for #<Paperclip::Attachment:0xb6e51da0>"
我正在为这个类使用回形针插件,我可以整天调用 save (即使在那个 perform 方法中)并且没有问题。我也可以整天调用 save(再次,甚至在执行中)并且看不到我的 after_create 方法被调用了不止一次——除非我正在使用延迟作业。(可能是在做某种自动重试?)
我要去看看我的回形针插件,看看发生了什么......
【问题讨论】:
标签: ruby-on-rails save delayed-job