Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 2上的延迟作业:can';t保存在“中”;执行;方法/如何知道工作何时完成?_Ruby On Rails_Save_Delayed Job - Fatal编程技术网

Ruby on rails Rails 2上的延迟作业:can';t保存在“中”;执行;方法/如何知道工作何时完成?

Ruby on rails Rails 2上的延迟作业:can';t保存在“中”;执行;方法/如何知道工作何时完成?,ruby-on-rails,save,delayed-job,Ruby On Rails,Save,Delayed Job,我正在使用Rails 2的延迟作业插件,每次我试图修改一个模型并将其保存在延迟作业所需的“perform”方法中时,它都会失败(没有错误消息或任何东西,只是在数据库中列为失败) 我在一个rails模型文件(视频)中有“perform”方法,我正在将该模型的一个实例(@Video)传递给Delayed::Job.enqueue 在队列中不能修改数据库是一个已知的问题吗?我是否做错了什么(它只在尝试保存时失败,而不是在我实际更改属性时失败,这听起来像是数据库修改问题) 如果这是预期的:我如何修复它?

我正在使用Rails 2的延迟作业插件,每次我试图修改一个模型并将其保存在延迟作业所需的“perform”方法中时,它都会失败(没有错误消息或任何东西,只是在数据库中列为失败)

我在一个rails模型文件(视频)中有“perform”方法,我正在将该模型的一个实例(@Video)传递给Delayed::Job.enqueue

在队列中不能修改数据库是一个已知的问题吗?我是否做错了什么(它只在尝试保存时失败,而不是在我实际更改属性时失败,这听起来像是数据库修改问题)

如果这是预期的:我如何修复它?我试图将一个“done”属性保存为true,以便知道模型何时准备好进入下一步。是否有一些标准的方法来确定延迟的工作何时完成

编辑:我已经确认调用perform standalone(没有延迟作业)在保存时没有问题(没有错误、警告或其他问题)。当我通过DelayedJobs调用它时,它在到达保存行时立即失败(没有超时)

编辑:等等,我想我知道发生了什么:我的“表演”是“创建后”回拨的一部分。。。这一切都很好,直到我试图拯救。看起来当我保存时,它会再次调用perform(虽然已经在perform中),这不会与延迟的作业一起运行(也不应该)。出于某种原因,我认为在创建之后只会被调用一次(而不是每次保存之后)。等等,一个简单的测试就证明了这一点。人力资源管理。。。那么,为什么在延迟的作业中,当我保存时调用perform两次,当我不保存时调用perform一次

我的代码:

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>"
“*[JOB]视频因名称错误而失败:未定义的局部变量或方法'flush\u deletes'用于#-2次失败的尝试
未定义的局部变量或#的“flush_deletes”方法“
我正在为这个类使用回形针插件,我可以全天调用save(即使在那个perform方法中)并且不会遇到任何问题。我还可以整天调用save(即使在perform中也是如此),并且不会看到我的after_create方法被多次调用——除非我使用的是延迟作业(可能是在进行某种自动重试?)


我将查看我的回形针插件,看看发生了什么…

如果保存失败,这与延迟的作业无关(至少不应该是这样,除非保存时间超过最大运行时间。)

尝试通过不使用延迟作业来诊断save的问题


再看一下日志中的delayed_job.log文件好的,不确定到底发生了什么,但我在lib目录中创建了一个骨架“TranscodeJob”类。这个类初始化时引用了我希望它处理的视频,并对其进行处理、保存和播放

基本上,将我的整个复杂视频对象(包括回形针插件)传递给延迟的作业似乎让事情变得非常糟糕,而传递一个简单的对象,没有超出它所需的信息,会让事情变得更简单

下面是我使用的代码,它工作得很好(如果工作得很好,我可以一点一点地添加我的长时间运行的代码,并确认它继续这样做,但它以前工作得很好,只是因为保存失败)

结束


这段代码仍然是从创建后的筛选器调用的,我没有看到它被调用两次,所以看起来我把DelayedJobs auto retry误认为是递归之类的东西。

但是当我单独运行“执行”时(没有延迟的工作),没有任何问题,没有任何失败或错误或任何东西。如果它只是在延迟作业下出现问题,这不意味着它是延迟作业问题吗?我会查看日志文件,谢谢你的提示。呃,没有延迟的job.log文件。你是说延迟作业如何写入正常的rails日志文件(在本例中是开发日志?)?如果是这样,就像我说的,我没有收到错误消息,它只是说“2个作业以0.2683 j/s的速度处理,2个失败。。。“等等……两份工作?我想我明白了,给我一点时间。。。
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