2011-08-10 12 views
3

我有一個應用程序必須重複啓動作業。但是(是的,如果沒有這個,那會很容易......)我希望用戶在應用程序中定義他們的備份頻率。如何在用戶的應用程序中定義作業的頻率?

最壞的情況下,他們將不得不選擇之間:

  • 每週,每天
  • 每12小時,
  • 每6小時一次,
  • 每小時

最好的情況下,他們應該能夠使用crontab表達式(例如documentation

如何做到這一點?我是否每分鐘都會啓動一項檢查上次執行時間和頻率的工作,然後在需要時啓動另一項工作?我是否創建了一個將由masterjob執行的隊列?

歡迎任何線索,想法,意見,最佳實踐,經驗!

編輯:解決了這個問題,使用Akka調度。好的,這是一個技術解決方案,不是設計答案,但仍然是一切都很好。

每個用戶定義的重複是一個演員,每個週期發送消息給新的演員執行實際的作業。

回答

1

有關於谷歌組的討論。據我記得,你必須定義一個每6小時開始一次的工作,並檢查哪些備份必須完成。所以你必須記得最後一次備份工作完成的時間並自己控制。我不確定Quartz是否可以處理這樣的需求。

我看着源代碼(總是一個很好的來源;-))並找到了每一個方法,我認爲這應該做你想做的。我不確定這是否是一個聰明的設計,因爲如果你有1000個用戶,那麼你將有1000個工作。我不確定Play是否能夠處理如此大量的工作。

[更新]對於cron的表達式,你應該看看到JobPlugin.scheduleForCRON()

+0

是的,的確,源碼在很多場合都是幫手,我會再次深入檢查這些東西。不知道scheduleForCron!謝謝;) –

+0

我檢查了scheduleForCron,它從類文件中讀取註釋。在我的情況下,這不是一個解決方案。 –

+0

我並不是說你可以直接使用'JobPlugin.scheduleForCRON()',但應該可以將代碼轉移到你的應用程序中。 – niels

1

可能有兩種方法可以做到這一點根據您的要求/結構:

如果只能使用Play:

  • 用戶創建作業及其運行的頻率(crontab,無論)。
  • 保存工作時,您首次計算必須運行的工作。然後,使用執行時間,作業ID和所需的任何其他信息將條目添加到表JOBS中。這是必需的,因爲Play是無狀態的,並且信息必須存儲在數據庫中供以後檢索。
  • 您有一份工作查詢表中的執行日期比現在少的條目。檢索第一個,運行它,將其從表中移除,併爲下一次執行添加一個新條目。你應該保留一些執行計數器,所以如果一個任務失敗(這意味着該條目不從數據庫中刪除),它不會阻止一次又一次地嘗試執行其他任務。
  • 此工作的頻率設置爲每秒運行一次。這樣,當表中有信息時,您應該儘可能多地執行請求。因爲如果你有足夠的任務,Play不會在現有人工作的情況下產生新的工作,這一項工作將爲所有人提供服務。否則,它會在某個時間點被殺死,並在需要時恢復。

當然,用戶的crons不會太精確,因爲您必須考慮您自己的cron延遲以及隊列中所有任務的執行延遲,這些延遲將按順序運行。不是最好的方法,除非你以某種方式拒絕每分鐘運行一次或更多次的計時器(爲了安全起見)。如果他們超過一定的時間,檢查cron的執行時間以殺死他們將是一個好主意。

如果你能使用比玩更多:

更好的選擇,我相信是使用Quartz(見this)當用戶創建工作創造未來的執行,並reproram一次執行結束。

0

有幾種方法可以解決這個問題。

如果你沒有一份非常大的工作量,我只需要使用所需的靈活性將它們堅持到一張表。然後每小時(或支持的最低時間間隔)檢查它們並運行符合條件的應用程序。簡單。

或者,如果您更喜歡使用cron語法,只需使用包裝器將用戶crontab寫入(導出)作業,該包裝器將調用回正在運行的應用程序,或者在獨立進程中啓動作業(如果可能的話)。

+0

這確實是我的想法,但這意味着我將不得不創建一個cron庫knd。 –

相關問題