java ee的小程序_Java EE调度程序
java ee的小程序
Java EE應用程序服務器具有本機調度支持,并且在大多數應用程序中,不需要包括外部依賴項,例如著名的Quartz調度程序庫。
Java EE 6和7完整配置文件上提供的Java EE 6計時器服務為我們提供了許多選項來定義調度間隔,以及如果停止并重新啟動包含調度程序的應用程序會發生什么情況。
Java EE調度程序可以是:
- 持久的 :應用程序服務器在應用程序關閉時保存計劃事件,以免丟失事件
- 自動 :簡單的調度程序定義,大多數細節由應用程序服務器處理
- 程序化的 :我們可以完全控制所有調度程序參數。
為了確定哪個是最佳選擇,我們應該首先回答以下問題:
1.是否可以錯過一些調度事件?
如果我們停止或重新啟動應用程序(例如在更新過程中),則調度程序將停止,并且某些調度事件可能會丟失。
可以將調度程序配置為保存錯過的事件,并在應用程序再次啟動時執行它們。 應用程序服務器使用內部數據庫(通常是Derby之類的Java DB)來存儲丟失的事件。
這是一個持久的調度程序。
注意 :應用程序服務器將在應用程序(重新)啟動時生成所有丟失的事件。 事件突發的頻率和延遲是可配置的。 有關詳細信息,請參見應用程序服務器文檔。
我們還可以選擇不保留計劃事件,如果應用程序未運行,則計劃事件將丟失。
在非持久性情況下,調度程序生命周期與應用程序相同:它在應用程序啟動時創建,然后在應用程序關閉時銷毀。
相反,持久性調度程序可以保留到應用程序重新啟動; 當應用程序未運行時,它只是在Hibernate。
如何選擇?
如果調度的功能對業務至關重要,而我們不能錯過任何事件,那么持久調度器就是您的理想之選。
在所有其他情況下,非持久性調度程序更輕便(不使用數據庫)并且易于管理(更新應用程序時的障礙更少,因為在應用程序重新啟動時不會出現任何調度事件;該調度程序始終在應用程序啟動時創建)。
2.該應用程序將在群集中運行嗎?
在集群中,我們的應用程序有多個實例正在運行(每個集群節點一個實例),并且所有實例都有自己的調度程序副本。
但是我們只需要在所有群集節點之間運行一個調度程序,否則我們將擁有同一事件的多個副本。
每個應用程序服務器都有自己的方式來處理“多個調度程序實例”問題(例如,請參閱WebSphere的[link 2]),但是通常,當我們使用集群時,要求調度程序應該是持久的。
3.調度間隔在生產時是否可以編程?
需要回答的另一個重要問題:在部署應用程序之后,我們是否應該能夠更改調度?
如果調度參數(它的頻率)是固定的,則自動調度程序是最佳解決方案,因為它的編碼非常簡單:只需一個注釋(如果您喜歡舊方法,則只需很少的XML行)。
相反,如果調度程序應該以某種方式可配置,則最好的解決方案是編程調度程序,它使我們能夠在應用程序啟動期間定義所有調度程序參數,并從屬性文件,數據庫或我們正在使用的任何配置解決方案中讀取它們。
記得:
- 自動調度程序計劃是在構建時定義的
- 程序化調度程序計劃是在應用程序啟動時定義的
自動排程器
定義自動調度程序非常容易:
注意:完整的代碼可以在文章項目中找到[請參見鏈接3]。
第一步:
@Startup @Singleton public class MyScheduler@ javax.ejb.Startup批注要求EJB容器在應用程序啟動時創建EJB(以及我們的調度程序)。
@ javax.ejb.Singleton批注強制EJB容器僅創建一個實例。
重要提示:調度程序由應用程序服務器(EJB容器)使用; 應用程序代碼的其余部分永遠不要實例化它。
然后,我們需要在安排事件時調用的方法:
@Schedule(/** scheduling parameters */) public void doSomeThing() {..}該方法應為public,并返回void。
@ javax.ejb.Schedule注釋定義:
- 計劃間隔,以cron格式[請參見鏈接4]
- 調度程序的名稱(應用程序中可以有許多調度程序)
- 一個持久的布爾標志,它定義調度程序是否持久
例如:
@Schedule(minute = "*/15",hour = "*",info = "15MinScheduler",persistent = false )它定義了每15分鐘運行一次的非持久性調度程序。
有關完整示例,請參見文章項目[鏈接3]中的AutomaticPersistentScheduler和AutomaticNonPersistentScheduler類。
注意 :還有@Schedules批注[請參見鏈接1],該批注允許定義多個@Schedule定義。
當存在無法在單個cron定義中表達的計劃要求時,此功能很有用。
程序調度器
編程調度程序的構建更為復雜,但它為我們提供了定義調度程序參數的完全自由。
我們還有更多步驟:
第一步與自動調度程序相同:
@Startup @Singleton public class MyScheduler然后(第二步),我們需要查找應用程序服務器計時器服務,但是注入可以幫助我們:
@Resource private TimerService timerService;在應用程序啟動時,EJB容器將注入一個TimerService實例,該實例允許我們與Timer服務進行交互。 例如,我們可以列出(甚至刪除)為應用程序定義的所有調度程序。
在我們的例子中,Timer服務將用于創建新的調度程序,如下所示(第三步):
String minuteSchedule = "*/15"; String hourSchedule = "*"; ScheduleExpression schedule = new ScheduleExpression().minute(minuteSchedule).hour(hourSchedule);javax.ejb.ScheduleExpression定義cron [請參見鏈接4]時間表,例如@Schedule批注。
@Schedule和ScheduleExpression之間非常重要的區別是,第一個固定在構建時固定:要更改調度參數(例如,從每15分鐘更改為每30分鐘),我們需要更改類代碼,然后再次構建和部署應用程序。
在后一種情況(SchedulerExpression)中,可以在應用程序啟動時定義和更改計劃參數(在示例中變量minutesSchedule和hourSchedule上方)并進行更改,例如,可以從以下代碼中讀取minutesSchedule和hourSchedule:
屬性文件或連接的DBMS。
javax.ejb.TimerConfig讓我們可以選擇定義調度程序的名稱(setInfo(String)),以及是否為持久性名稱(setPersistent(boolean))。
使用ScheduleExpression和TimerConfig實例,我們可以使用Timer服務創建調度程序(更精確地說是日歷計時器)。
timerService.createCalendarTimer(schedule, timerConfig); createCalendarTime()方法返回一個javax.ejb.Timer實例,該實例可用于查詢計時器,例如下一個將來的事件何時發生甚至破壞。
調度程序。
最后一步是在類中定義一個方法,該方法將在每次調度事件時調用
@Timeout public void doSomeThing() {..}該方法應為public,并返回void。
我們已經啟動并運行了調度程序。
結論
Java EE標準為我們提供了許多選擇來定義計劃程序,該計劃程序以周期性和重復的方式運行我們的代碼。 不需要其他項目依賴項。
鏈接
翻譯自: https://www.javacodegeeks.com/2016/10/java-ee-schedulers.html
java ee的小程序
總結
以上是生活随笔為你收集整理的java ee的小程序_Java EE调度程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux授权用户文件夹权限(linux
- 下一篇: java单词按字典排序_最终Java日志