从collectiveidea / delayed_job中登录

时间:2010-12-05 17:01:07

标签: ruby-on-rails delayed-job

我尝试在rails中的delayed_job内登录。

我将其配置如下:

Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.max_attempts = 3
Delayed::Worker.backend = :active_record
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/#{Rails.env}_delayed_jobs.log", Rails.logger.level)
Delayed::Worker.logger.auto_flushing = 1

定义我的工作:

class TestJob

    def initialize(user)
        @user = user
    end


     #called when enqueue is performed
    def enqueue(job)
       Delayed::Worker.logger.info("TestJob: enqueue was called")
    end

    def perform
        Delayed::Worker.logger.info("\n\n\n\nTestJob: in perform, for user #{@user.twitter_username}")
    end
end

但是当我打电话给我的工作时

 Delayed::Job.enqueue(TestJob.new(user), 2)

即使delayed_jobs表显示已执行作业,日志文件仍为空。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不使用DJ的命名空间即可试用。

这是我刚才使用的工作代码。注意:Logger.new只会附加到.log文件(如果已存在)。

class ScrapingJob < Struct.new(:keyword_id)
  def perform
      begin
       ...
      rescue =>  error
        log = Logger.new("#{Rails.root}/log/scraping_errors.log")
        log.debug "logger created for '#{keyword.text}' (#{keyword.id}) on '#{keyword.website.url}' (#{keyword.website.id})"
        log.debug "time: #{measured_at.to_s(:short)}"
        log.debug "error: #{error}"
        log.debug ""
      end
    end
  end

答案 1 :(得分:0)

我猜这是一个序列化问题,DJ试图序列化User对象。 DJ在提出这些错误方面做得不好。

你是否有机会使用Mongoid?我知道有一个JSON化Mongoid对象的问题。

如果将user_id字符串传递给Job而不是User对象,它是否有效?像这样...

class TestJob

    def initialize(user_id)
        @user = User.find(user_id)
    end

    # ...

end 

即使它不那么漂亮,我认为最好将文字(字符串,浮点数等)传递给DelayedJob或任何后台工作者。这样可以更容易地交换处理器,以防您以后想要迁移到Resque。