2012-03-13 41 views
2

我正在與第一次延遲工作,我沒有任何運氣得到它的工作,我不明白爲什麼。工作排隊,但從不執行。它確實從數據庫中刪除,所以工作人員似乎正在處理它,但它並沒有運行看起來的執行方法。延遲的工作職位沒有執行

我已經設置了以下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 

這段代碼中沒有永遠運行。我已經嘗試將調試代碼添加到執行方法中,並且它永遠不會執行,所以肯定會發生一些事情。我所說的工作從模型是這樣的:

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) 

我唯一的猜測是,我稱爲延遲:: Job.enqueue錯誤,但這似乎是基於我讀過的所有內容應該如何完成的。

回答

2

如果DJ因爲任何原因無法反序列化工作,這可能會發生,因爲工作人員會迫使工作失敗。這似乎沒有默認記錄。嘗試禁用失敗的作業刪除Delayed :: Worker.destroy_failed_jobs = false並查看是否有錯誤。

+0

如果沒有指定隊列,它不會起作用。我不限制隊列。出於測試目的,該工作人員以'bundle exec rake jobs:work'開始。所有日誌顯示在工人啓動時爲1行,停止時爲1。沒有什麼中間。 – Eugene 2012-03-13 19:23:50

+1

嘗試使用ActiveRecord查詢的rails日誌。你能看到DJ投票嗎?還有,這個工作還在數據庫中嗎? – betamatt 2012-03-13 19:26:57

+0

延遲工作肯定是輪詢,這裏是日誌片段:https://gist.github.com/fb05ccb37abd42c08801。作業在「運行」後從數據庫中刪除,但代碼從未執行。它像DJ一樣在看着這個工作,然後忽略它。 – Eugene 2012-03-13 19:30:44