2013-03-26 63 views
0

我正在爲一些後臺服務運行delayed_job,直到最近,這些服務都是單獨運行的,例如,發送電子郵件,撰寫報告等。Delayed_job在進行第二個任務時進入繁忙循環

我現在需要一個delayed_job作爲其最後一步提交另一個delayed_job。

  1. delay.deploy() - delayed_job的這種運行時,它會觸發部署動作,其中最後一步是...
  2. delay.update_status() - 當delayed_job的運行此作業時,它會檢查我們開始部署的狀態。如果部署仍在進行中,我們再次調用delay.update_status(),如果部署已停止,我們將最終部署狀態寫入db記錄。

步驟1正常工作 - 5秒後,delayed_job啓動部署,啓動部署,然後調用delay.update_status()。

但是,在這裏, 代替update_status()在5秒內啓動,delayed_job進入繁忙循環,觸發一堆update_status調用,並且在沒有暫停的情況下很難循環。

我可以看到滿足所有這些調用的日誌,服務器變慢,直到達到update_status的結束條件(部署最終成功或失敗),並且事情再次變得安靜。

我是否在使用Delayed_Job :: delay()的時候錯誤地忽略了這個用例的一個基本特徵?

回答

0

確定事實證明這是「預期行爲」 - 如果您已經在運行delayed_job的代碼中,並且再次調用.delay(),而沒有指定延遲,它將立即運行。您需要添加參數run_at:

delay(queue: :deploy, run_at: 10.seconds.from_now).check_status 

the discussion in google groups

相關問題