2014-07-10 56 views
2

或者,如果失敗,則從調度程序中刪除任務並添加一個新任務。在運行時更改Spring任務的計劃時間?

恐怕這是春天的一部分我對100多%或100%的無知,花了一個下午閱讀有關它的文章沒有闡明很多東西。

基本上,我有一個程序有三個計劃任務,一個每運行500毫秒,兩個基於cron表達式運行。我的客戶希望能夠即時更改這些cron表達式。

附近,我可以說這意味着我需要從應用程序上下文中取出cron表達式並將它們移動到數據庫。這部分很容易。最難的部分是弄清楚如何在Spring中獲得對已經存在的計劃任務的引用,並在下一次應該運行時進行更改。關於此主題的每篇文章都只描述瞭如何設置應用程序上下文或註釋。

我一直能找到的唯一答案是only work for regular intervals(根據評論,這可能實際上並不工作)。我希望不必寫一些解釋Cron表達式的東西,所以我正在考慮這個解決方案「B計劃」。

感謝您的幫助!

+0

你在使用'@ Scheduled'方法嗎? –

+0

現在正在使用的那些將在applicationContext.xml中進行調度,而不是使用註釋。我可以切換到註釋,但我仍然不知道如何在運行時更改週期。 –

+1

對於動態任務,我不會使用這種機制。考慮使用'ExecutorService'並自己提交任務。或者更好的是,使用石英並通過它來管理任務。 [春天不讓你玩預定任務](http://stackoverflow.com/questions/21791853/how-are-spring-taskscheduled-objects-represented-at-runtime)。 –

回答

0

您應該可以使用Quartz scheduler API來操作作業及其觸發器。

在你的Spring的ApplicationContext你最有可能有一個調度豆(org.springframework.scheduling.quartz.SchedulerFactoryBean),並在你的應用程序,你可以調用這個bean各種方法:

  • 獲取列表所有的工作(見getJobGroupNames + getJobKeys + getJobDetail方法)
  • 獲取所有觸發器的列表(見getTriggerGroupNames + getTriggerKeys + getTrigger方法)
  • 獲取某項工作的觸發器的列表(見getTriggersOfJob法)
  • 更新觸發器定義(見rescheduleJob法)

請參考http://quartz-scheduler.org/api/2.2.0/對API的細節。目前尚不清楚您使用的是Quartz調度器版本,但其他版本的API並沒有太大差異。

您也可以考慮使用外部Quartz調度器GUI,它允許您更多地執行此操作,而不必將此邏輯編碼到應用程序中。你可能想檢查QuartzDesk(其中我是原作者,所以我有點偏見),或其他類似的產品,如(只是谷歌「石英調度器gui」)。

相關問題