您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么使用Quartz實現(xiàn)Java高可用定時任務(wù)的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用Quartz實現(xiàn)Java高可用定時任務(wù)文章都會有所收獲,下面我們一起來看看吧。
如果你想做定時任務(wù),有高可用
方面的需求,或者僅僅想入門快
,上手簡單,那么選用它準(zhǔn)沒錯。
定時任務(wù)模塊是對Quartz框架進(jìn)一步封裝,使用更加簡潔。
<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-quartz</artifactId> <version>1.5.4.1</version> </dependency>
實現(xiàn)org.quartz.Job
接口;使用注解CronExp
添加任務(wù)的調(diào)度策略;使用注解Component
將任務(wù)注入容器中。
啟動項目,定時任務(wù)便處于監(jiān)聽與運行中。
@Component @DisallowConcurrentExecution @CronExp(cron = "0/5 * * * * ?") public class DemoJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("任務(wù)1:" + LocalDateTime.now()); } }
定時任務(wù)除了以既有頻率周期性運行外,還有通過接口手動被觸發(fā)的能力。
調(diào)用如下接口,可手動觸發(fā)任務(wù)ID編號為jobId
的任務(wù)。
http://localhost:8080/cms-api/quartz/job/{jobId}
如果有手動觸發(fā)定時任務(wù)的需求,則需要任務(wù)ID唯一并
且已知
,因此需要在編寫定時任務(wù)時手動指定。
@CronExp(id = 1, cron = "0/5 * * * * ?")
通過注解CronExp
的id屬性可指定任務(wù)ID,不顯示指定則使用隨機(jī)ID,不滿足已知的條件,因此無法手動觸發(fā)。
盡管大多數(shù)任務(wù)不需要注入?yún)?shù),但仍有少量的場景需要向定時任務(wù)注入?yún)?shù)。
public void execute(JobExecutionContext context) { /* 如果在調(diào)用任務(wù)時傳入了參數(shù),則能夠從Map中獲取 */ Map<String, Object> dataMap = context.getMergedJobDataMap(); /* 比如從Map中獲取一個鍵值對,一般來說參數(shù)均為基本數(shù)據(jù)類型 */ Object key = dataMap.get("key"); System.out.println("任務(wù)2:" + LocalDateTime.now() + ": " + key); }
在編寫定時任務(wù)時,可從JobExecutionContext
對象中解析一個Map,從而完成參數(shù)的注入。
http://localhost:8080/cms-api/quartz/job/1?key=a
上述http調(diào)用的含義是手動觸發(fā)任務(wù)ID為【1】的任務(wù),并且向其傳遞參數(shù)為【key】值為【a】的參數(shù)。
本框架不支持任務(wù)并發(fā),換句話說并發(fā)對定時任務(wù)不利,因此需要手動禁止。
需要注意的是Quartz
的并發(fā)是指當(dāng)任務(wù)執(zhí)行耗時超過任務(wù)調(diào)度周期時,上一個任務(wù)未執(zhí)行完,新任務(wù)是否執(zhí)行。
一般來說需要顯示禁止并發(fā),在任務(wù)類上添加注解DisallowConcurrentExecution
即可禁止任務(wù)并發(fā)。
如果定時任務(wù)有高可用的需求,那么需要對任務(wù)進(jìn)行持久化。定時任務(wù)數(shù)據(jù)持久化到數(shù)據(jù)庫中后,支持應(yīng)用程序多開。定時任務(wù)持久化多節(jié)點部署后,集群中單節(jié)點故障不影響定時任務(wù)的執(zhí)行。
定時任務(wù)持久化,僅需修改yml文件配置即可達(dá)到目標(biāo),無需修改代碼。一般而言使用Mysql做持久化的容器。
spring: quartz: properties: org.quartz.jobStore.isClustered: true org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource: qzDS org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo org.quartz.dataSource.qzDS.user: root org.quartz.dataSource.qzDS.password: 123456
除了修改主機(jī)、端口、數(shù)據(jù)庫名、用戶名、密碼五個參數(shù)外,其余參數(shù)使用默認(rèn)值即可。
配置完數(shù)據(jù)庫連接后,使用SQL腳本,注意初始化數(shù)據(jù)庫
關(guān)于“怎么使用Quartz實現(xiàn)Java高可用定時任務(wù)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用Quartz實現(xiàn)Java高可用定時任務(wù)”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。