我正在使用Rails 2的Delayed Jobs插件,每次我尝试修改模型并将其保存在Delayed Jobs所需的“perform”方法时,它都会失败(没有错误消息或任何东西,它只是列为数据库中的失败)。
我在其中一个rails模型文件(Video)中使用了“perform”方法,并且我将该模型的实例(@video,让我们说)传递给Delayed :: Job.enqueue
在队列中,您是否无法进行数据库修改?我做错了什么(它只在尝试保存时失败,而不是在我实际更改属性时,这听起来像是数据库修改问题)。
如果这是预期的:我该如何解决?我正在尝试将“done”属性保存为true,因此我知道模型何时准备好进入下一步。是否有一些标准的方法来确定延迟工作何时完成?
编辑:我已经确认调用执行独立(没有延迟作业)没有保存问题(没有错误或警告,或任何东西)。当我通过DelayedJobs调用它时,它立即失败(没有时间)第二个它到达保存行。
编辑:等等,我想我知道发生了什么:我的“执行”是“after_create”回调的一部分......这一切都很好,直到我试图保存。它看起来像我保存时,它调用执行AGAIN(虽然已经执行),并且不会与延迟作业一起飞行(也不应该)。出于某种原因,我认为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>"
我正在使用这个类的paperclip插件,我可以整天调用save(即使在那个执行方法中)并且没有问题。我也可以整天调用save(再次,甚至在执行中)并且看不到我多次调用的after_create方法 - 除非我使用延迟作业。(可能是它正在进行某种自动重试?)
我要查看我的回形针插件,看看发生了什么......
答案 0 :(得分:0)
如果您的保存失败,则它与delayed_job无关(至少除非保存时间超过MAX_RUN_TIME,否则不应该这样做。)
尝试通过不使用delayed_job来解决保存问题。
另请查看日志中的delayed_job.log文件
答案 1 :(得分:0)
好的,不确定发生了什么,但我在我的lib目录中创建了一个骨架“TranscodeJob”类。这个类初始化时会引用我希望它处理的视频,并对其进行处理,保存,并与Delayed Job很好地配合。
基本上,看起来将我整个复杂的视频对象(带有回形针插件)传递给延迟工作看起来很糟糕,传递一个简单的对象,没有比它需要的更多信息使事情变得更容易。
下面是我使用的代码,它运行得很好(如果工作正常,我可以一点一点地添加我长时间运行的代码,并确认它继续这样做,但它之前工作正常,只是因为节省打嗝)
class TranscodeJob
def initialize(video_id)
@video_id = video_id
end
#delayed jobs expected method
def perform
@video = Video.find(@video_id)
@video.flash_status = 100
@video.save!
end
端
此代码是从after_create过滤器调用的,我没有看到它被调用两次,所以看起来我误认为DelayedJobs会自动重试递归,或者其他什么。