【问题标题】:Delayed::Job.enqueue queuing up jobs, and Heroku clearing them from the queue, but my perform method is never called; why?Delayed::Job.enqueue 排队作业,Heroku 从队列中清除它们,但我的 perform 方法从未被调用;为什么?
【发布时间】:2011-06-21 00:52:56
【问题描述】:

我在我的 Rakefile 的 cron 任务中排队工作,例如:

Delayed::Job.enqueue(MyJob.new(variable))

我在 /lib 中有一个类如下:

class MyJob < Struct.new(:variable)
    def perform
        Watchdog.create(:module => 'MyJob', :messagetype => 'Notice', :message => "Variable is #{variable}")
    end
end

我有一个看门狗类,如下:

class Watchdog < ActiveRecord::Base
    attr_accessible :id,
            :module,
            :message_type,
            :message,
            :created_at,
            :updated_at
end

我已经将它部署到 Heroku。在我运行 heroku rake cron 后,我看到一个作业被放置在我的 Delayed_jobs 表中(例如,它已入队),并且我看到在我添加一个工作人员后,它已从队列中删除。然而,对 Watchdog.all 的调用会返回一个空集。

因此,作业似乎已入队和出队,但未执行我的 MyJob 对象的 perform 方法。

我在 Heroku 上运行 Rails 3 和 Ruby 1.8.7。

有谁知道为什么我的 perform 方法没有被调用?非常感谢您的帮助。我对 Rails 比较陌生。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 heroku delayed-job


    【解决方案1】:

    我编写 DelayedJob 类的方式是这样的:

    class MyJob
        attr_accessor :variable
    
        def initialize(variable)
           self.variable = variable 
        end
    
        def perform
            Watchdog.create(:module => 'MyJob', :messagetype => 'Notice', :message => "Variable is #{variable}")
        end  
    end
    

    这可能在功能上等同于您正在执行的操作,但我知道此表单有效。

    【讨论】:

      【解决方案2】:

      可能性 1

      Watchdog 具有属性 message_type,但您的作业会创建一个具有属性 messagetypeWatchdog

      可能性 2

      DelayedJob 可能无法序列化和反序列化从 Struct.new(:variable) 继承的作业类。

      尝试 Steve Wilhelm 建议的方法并使用“正常”类定义:

      class MyJob
        attr_accessor :variable
      
        initialize(variable)
          self.variable = variable
        end
      
        def perform
          Watchdog.create(
            :module => 'MyJob',
            :message_type => 'Notice',
            :message => "Variable is #{variable}"
          )
        end  
      end
      

      【讨论】:

        【解决方案3】:

        事实证明,在非常尊重为这个问题提供可能解决方案的两个人的情况下,他们都没有成功。经过进一步调查,我确定我的 MyJob 类在 Heroku(或我的本地机器上)上运行时不适用于 job:work rake 任务。我为解决这个问题所做的就是在我的 config/application.rb 文件中包含以下行:

        require './lib/my_job.rb'
        

        然后,当 Delayed::Job 使作业出队并且 YAML::load() 处理程序时,类定义可供它使用,它能够创建新对象并在其上运行 perform 方法。

        【讨论】:

          【解决方案4】:

          我敢打赌,这根本不是延迟工作。也许代码本身失败了,而不是工作入队/出队。尝试检查heroku logs,看看它是否由于某种原因而失败。

          另外,您确定 MyJob.perform 可以按预期工作吗?您可以使用heroku console 直接在 Heroku 上启动交互式 ruby​​ shell。尝试初始化 MyJob 类并运行 perform 以确保它正常工作。

          【讨论】:

            猜你喜欢
            • 2011-05-31
            • 2020-09-27
            • 1970-01-01
            • 2014-12-11
            • 2013-08-08
            • 1970-01-01
            • 1970-01-01
            • 2011-06-02
            • 2011-03-02
            相关资源
            最近更新 更多