使用註解定時Quartz+資料庫持久+動態job監聽(或許還支援分散式)
阿新 • • 發佈:2018-12-29
springmvc框架已經很成熟了,所以引入的jar包我就不詳細說了,百度有很多我先簡單描述我說的主要功能:
由spring的Quartz在啟動之後,掃描資料庫的任務,使用場景,需要動態新增定時任務如:定時啟動某智慧家居裝置,定時抽獎等,
這裡順便附上一份第一種quartz的xml方式: (他支援的註解也可以是 {@Scheduled(cron = "0/10 * * * * *")}這種形式)
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="syncAppDayJobCronTrigger " />
</list>
</property>
</bean>
<!-- CORE的所有任務-->
<bean id="coreJob" class="live.mica.core.biz.job.CoreJob"/>
<!-- 定時把每天日期放入快取 -->
<bean id="syncAppDayJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="coreJob "/>
</property>
<property name="targetMethod">
<value>syncAppDay</value>
</property>
<property name="concurrent" value="false">
</property>
</bean>
<bean id="syncAppDayJobCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="syncAppDayJob " />
</property>
<property name="cronExpression">
<!-- 每天0點5分 -->
<value>0/10 * * * * ?</value>
</property>
</bean>
live.mica.core.biz.job.CoreJob
@Service
public class CoreJob {
/**
* 定時把每天日期放入快取
*/
public void syncAppDay() {
log.info("sync syncAppDay info start...");
try {
} catch (Exception ex) {
log.error("fail to sync syncAppDay info.", ex);
} finally {
log.info("sync syncAppDay info end.");
}
}
}
其中需要注意的地方我用顏色標了出來,相同的顏色表示有對應關係。
很顯然,每個任務都是提前在xml裡配置的,沒辦法動態靈活新增啟用,
在15年使用了資料庫的註解,專案就是智慧傢俱的定時功能,但在17年的時候用spring boot做後臺的時候(是開源框架),使用了配置大於預設的註解,而且很規範,就想移植到當前的核心專案中,但是問題來了spring boot沒有任何宣告配置,就能使用這個定時,而我在普通專案的時候是有很多配置的,網上找也很片面,所以趁現在移植專案,寫一個比較傻瓜的文件(個人比較傾向傻瓜式code程式碼)
spring的jar包我就不說了,直接進入正題:
個人理解技術的主要思想:
spring 本身的定時很好,但是如果要加上動態新增隨意啟動的效果,需要比第一種方式多一個操作:
和 spring的job 公用一個任務工廠,當專案啟動時,去初始化定時器,然後把資料庫的定時資料 構建到spring的job中
紅色部分就是需要重點xml配置的地方:
<!--新增quartz支援 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
<!--載入可執行的任務-->
<bean id="scheduleJobService" class="live.mica.core.quartz.service.ScheduleJobService" init-method="init" />
live.mica.core.quartz.service.ScheduleJobService:
@Service
public class ScheduleJobService {
@Autowired
private Scheduler scheduler;
private static final String CRON_DATE_FORMAT = "ss mm HH dd MM ? yyyy";
/**
* 專案啟動時,初始化定時器
*/
@PostConstruct
public void init(){
List<ScheduleJobEntity> scheduleJobList = new arrayList<>();//查資料庫
for(ScheduleJobEntity scheduleJob : scheduleJobList){
CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
//如果不存在,則建立
if(cronTrigger == null) {
//構建job資訊
}else {
//更新定時任務
}
}
}
}
這是專案中移植的全部程式碼,xml裡的就上圖的兩句。
雖然程式碼多了點,但是結構比較清晰,支援連線池,分散式,雖然自己想寫的更詳細些,寫文件的時候發現大部分都是程式碼,核心其實很簡單,步驟很少。程式碼不好上傳,sorry~