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