2011-09-19 26 views
1

我使用resque來完成一些(很長時間)的工作。而且我有幾個課程使用相同的混合模塊進行排隊。 Class Service替代了測試,這就是它獨立和(可能太多)複雜的原因。這樣的故事是,當我直接打電話Resque啓動作業,但什麼都不做

Campaign.perform(user_id) 

,一切正常,但是當我嘗試使用隊列:創建

Resque.enqueue(Campaign, user_id) 

工作,但好像什麼都不做。至少,沒有任何東西保存到數據庫中。這是Campaign類的主要任務。我可以在resque-web-interface中看到作業創建並完成,並完成(幾乎在創建之後加快),但沒有結果。

我在Resque新的和真的不知道它會調用一切(困惑如何調試它)。

是否有人有類似的問題?謝謝你的幫助。

模塊:

module Synchronisable 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    def perform(user_id) 
     save_objects("#{self.name}::Service".constantize.get_objects(user_id)) 
    end 

    protected 

    def save_objects(objects) 
     raise ArgumentError "should be implemented" 
    end 
    end 

    class Service 
    def self.get_objects(user) 
     raise ArgumentError "should be implemented" 
    end 
    end 
end 

其中一個類:

class Campaign < ActiveRecord::Base 
    include Synchronisable 
    @queue = :app 

    class << self 
    protected 
     def save_objects(objects) 
     #some stuff to save objects 
     end 

    end 
    class Service 
    def self.get_objects(user_id) 
     #some stuff to get objects 
    end 
    end 
end 
+0

我有同樣的問題。喬布斯會入隊,但不會跑多數時間。偶爾它實際上有效。 –

回答

1

這些工作崗位幾乎可以肯定失敗,由於異常。什麼是resque-web在「故障」選項卡上顯示您?您也可以從與Rails控制檯中看到這一點:

Resque.info 

Resque::Failure.all(0) 
+0

正如我在問題中所說的,問題是我的工作看起來根本沒有開始。沒有錯誤或異常(它們不會出現在「故障」選項卡中)。但是也無所作爲。我嘗試使用命令Resque.enqueue(Сampaign,user.id) – sheepwalker

+0

手動啓動它們,您可以將我們指向api-doc或其他類似的東西嗎?我真的很陌生,需要調查一些失敗。 – Ramy

+0

@Ramy,只需瀏覽代碼;現實中並沒有太多。您可能會更好地啓動resque-web和瀏覽,但它會顯示在自述文件中:https://github.com/defunkt/resque/blob/master/README。markdown – d11wtq

1

你應該運行你的工人是這樣的:

nohup QUEUE=* rake resque:work & &> log/resque_worker_QUEUE.log 

這將輸出所有你調試到「日誌/resque_worker_QUEUE.log「,你將能夠找出你的Campaign類有什麼問題。

+1

hm,做完之後我的resque_worker_QUEUE.log只有一個空行 - 當我的作業開始/完成時仍然沒有任何動作 – sheepwalker

0

試試這個:

env TERM_CHILD=1 COUNT=2 "QUEUE=*" bundle exec rake resque:workers 
0

這是一個非常古老的問題,所以不知道如何軌的文件夾結構退縮,但我有同樣的問題,問題是與繼承。似乎你是否使用Resque你的工作類不應該從ApplicationJob繼承。

所以如果你的代碼是這樣的(應用程序/工作/ campaign_job.rb):

class Campaign < ApplicationJob 
    @queue = :a_job_queue 
    def self.perform 
    #some background job 
    end 
end 

然後取出繼承即 「< ApplicationJob」