2013-12-10 22 views

回答

4

您可以定義工作的依賴性:

# config/initializers/superworkers.rb 
Superworker.create(:MySuperworker, :user_id) do 
    Worker1 :user_id 
    Worker2 :user_id 
end 

# Anywhere 
MySuperworker.perform_async(123) 

當您運行MySuperworker,Worker1將啓動。完成後,Worker2將開始。這使您可以將依賴關係圖與工作人員分開。 (免責聲明:我是寶石的作者。)

5

只使用Sidekiq;答案是否定的。正如DickieBoy所建議的那樣,當依賴作業完成時,您應該能夠將其啓動。像這樣的東西。

# app/workers/hard_worker.rb 
class HardWorker 
    include Sidekiq::Worker 

    def perform() 
    puts 'Doing hard work' 
    LazyWorker.perform_async() 
    end 
end 

# app/workers/lazy_worker.rb 
class LazyWorker 
    include Sidekiq::Worker 

    def perform(name, count) 
    puts "Guess it's time I do something" 
    end 
end 

這裏LazyWorker只運行在HardWorker的結尾;如果不總是需要,可以添加額外的邏輯; LazyWorker仍然可以在需要時直接調用。這應該適用於大多數(如果不是全部)用例;和Sidekiq一起,這真的是你唯一的選擇,除非你拉入其他的寶石。


當直接從另一個工作射擊不夠好......

如果你正在做的事情在那裏,這將無法正常工作,你應該考慮一個狀態機。當一個工作被解僱時,它會創建一個自己的記錄,可能還有一個ID,並且可能有運行,失敗,已完成,等待狀態。然後,依賴作業可以輕鬆地檢查狀態表中的一個或多個依賴關係,並確保它的所有依賴關係都得到滿足。

你依賴的工作可以做一個查找表,狀態表使用Sidekiq Superworker依賴

相關問題