未执行的延迟作业作业

时间:2012-03-13 14:36:38

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

我第一次使用延迟工作,我没有运气让它工作,我不明白为什么。作业排队,但从不执行。它确实从数据库中删除了,所以工作者似乎正在处理它,但它似乎没有运行它看起来的执行方法。

我已经设置了以下initalizer:

require 'delayed/worker'
Dir.glob("./app/jobs/*.rb").each { |f| require f }

Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/dj.log", Rails.logger.level)
module Delayed
  class Worker
    def self.dj_say(text)
      self.logger.info "#{Time.now.strftime('%F %T %z')}: #{text}" 
    end
  end
end

初始化程序正常工作,并且dj.log会在工作开始/退出时写入。

我的工作包括以下内容:

class UpdateServices
  attr_accessor :options
  def initialize(options)
    self.options = options
  end

  def perform
    #Debugging code
    Delayed::Worker.dj_say "starting"
    File.open("tmp/test.txt","w").close
    #End debugging code
    #bunch-o-code-here
    Delayed::Worker.dj_say "completed"
  end
end

这些代码都没有运行。我已经尝试将调试代码添加到perform方法中,它永远不会被执行,因此肯定会发生一些事情。我用这样的模型来调用这个工作:

class Service < ActiveRecord::Base
  def start_updating!(options)
    Delayed::Job.enqueue(UpdateServices.new(options), :priority => 0, :run_at => 30.seconds.from_now, :queue => 'update_services')
  end
end

这个模型是从我的控制器那样调用的:

Service.new.start_updating!(params)

我唯一的猜测是我被称为Delayed :: Job.enqueue错误,但这似乎是基于我读过的所有内容应该如何完成。

1 个答案:

答案 0 :(得分:2)

如果DJ无法以任何理由反序列化作业,这可能会发生这种情况,因为工作人员会强迫这项工作永久化。默认情况下,这似乎不会被记录。尝试禁用失败的作业删除Delayed :: Worker.destroy_failed_jobs = false并查看是否有错误。