2015-10-29 34 views
0

我在用sidekiq調用另一個工人內部工人時遇到問題。 我有一兩個工人,看起來像這樣:通過API用sidekiq在另一個工人內部調用工人,

class UserExportWorker 
    include Sidekiq::Worker 

    sidekiq_options queue: :users, unique: true, retry: false 

    def perform(user_id) 
    # code that exports user to external service via API 
    UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id) 
    end 
end 

class UserExportStatusWorker 
    include Sidekiq::Worker 

    sidekiq_options queue: :users, unique: true, retry: false 

    def perform(user_export_id, user_id) 
    # code that check if exporting user to external service via API is finished 
    if export.completed? 
     user.update(status: 'exported') 
    else 
     UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id) 
    end 
    end 
end 

UserExportWorker出口用戶到一些外部服務和運行UserExportStatusWorker如果出口在外部API完成後,將檢查,如果它不是那麼它將啓動同樣的工作者,當輸出完成時它會更新數據庫中的用戶狀態列。問題是,即使導出到外部API成功,UserExportStatusWorker也不會更新數據庫中的用戶。但是,當我將我的代碼更改爲:

class UserExportWorker 
    include Sidekiq::Worker 

    sidekiq_options queue: :users, unique: true, retry: false 

    def perform(user_id) 
    # code that exports user to external service via API 
    UserExportStatusWorker.new.perform(user_export_id, user_id) 
    end 
end 

class UserExportStatusWorker 
    include Sidekiq::Worker 

    sidekiq_options queue: :users, unique: true, retry: false 

    def perform(user_export_id, user_id) 
    # code that check if exporting user to external service via API is finished 
    if export.completed? 
     user.update(status: 'exported') 
    else 
     UserExportStatusWorker.new.perform(user_export_id, user_id) 
    end 
    end 
end 

我完全沒有想法......爲什麼這不起作用?

+0

是的,第二個例子正常工作......沒有他們不是。在第二個示例中,我使用new.perform而不是perfrom_in –

+1

「UserExportStatusWorker」中的某些作業是否正在使用'perform_in'排隊? – Anthony

+0

在sidekiq我有可視的用戶界面,給我關於當前工作的信息。當我使用perform_in時,我在sidekiq管理面板中看到該作業是在1分鐘內安排的。但之後不會發生。作業從預定作業中消失,但成功完成作業的計數器沒有變化 –

回答

0

理想情況下,如果要在Worker上重新啓動,您應該引發一個錯誤,並讓sidekiq重試它,如docs中所述。

所以你的情況,你UserExportWorker類你可以有檢查,如果出口成功運行的方法,如果沒有,引發自定義ExportNotSuccessfulError