【问题标题】:Callback after delayed_job process jobdelay_job 处理作业后的回调
【发布时间】:2011-03-16 15:16:37
【问题描述】:

我需要在 delayed_job 处理一个任务后更新模型,例如:

foo.delay.something

something 完成后,我需要更新 foo 对象,最好的方法是什么?我正在考虑在Delayed::Backend::ActiveRecord::Job 类上编写回调,但应该有一些更清洁和更好的方法来做到这一点。

【问题讨论】:

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


    【解决方案1】:

    我会在 #foo 方法的末尾更新它:

    def foo
      # do work here
      update_attribute :processed, true
    end
    

    【讨论】:

      【解决方案2】:

      我不明白你为什么不把它作为已经作用于对象的工作的一部分。

      【讨论】:

      • 是的,我可以delay 整个流程,但我想知道如何触发after_processed 回调。
      • 我有类似的情况,但在我的情况下,它可以在第一个工作结束时排队另一个工作。另外,需要注意的是,创建的作业本身就是 ActiveRecord 对象,所以如果你想在那里添加生命周期回调,你可以这样做。
      • 嘿,谢谢,就个人而言,对于这种特定情况,我更喜欢将回调添加到 Job 实例的想法,而不是一个接一个地排队作业,所以,我要在 Job 上进行回调实例:)
      【解决方案3】:

      按照建议更新记录很好,但这只是解决方案的一部分...

      如果我想更好地控制失败时的操作,回调会有所帮助..即:

      Delayed::Job.enqueue InstructionRequestJob.new( p1, p2 )
      
      InstructionRequestJob perform
      - perform a task on a remote server
      - get a response
      - case response
        when OK
          update attribute ( as suggested)
        else
          # how many attempts ?
          if too_many_attempts
             update attribute
             destroy the job
          else
             reschedule the job for another attempt
      - end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多