spring版本4.1.2和quartz 2.2.1整合,實現持久化到數據庫
先在spring中配置好scheduler;
<bean id="simpleJobListener" class="xxx.xxx.quartz.task.SimpleJobListener"/> <bean id="mapScheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="configLocation" value="classpath:conf/quartz.properties"/> <property name="globalJobListeners"> <list> <!-- job監聽器 --> <ref bean="simpleJobListener"/> </list> </property> <property name="triggers"> <list> <!-- 在這里配置定時任務調度器 --> <ref bean="testCornTrigger"/> </list> </property> </bean> <!-- 配置的JobDetai --> <bean id="testJobDetai" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- durability 表示任務完成之后是否依然保留到數據庫,默認false --> <property name="durability" value="false" /> <property name="jobClass" value="xxx.xxx.quartz.task.TestJob" /> </bean> <!-- 配置的JobDetai,基於corn的調度器 --> <bean id="testCornTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="testJobDetai"/> <!-- 每天23點執行一次 --> <property name="cronExpression" value="0 0 23 * * ?"/> </bean>
quartz.properties文件配置
#============================================================== #Configure Main Scheduler Properties #============================================================== org.quartz.scheduler.instanceName = quartzScheduler org.quartz.scheduler.instanceId = AUTO #============================================================== #Configure JobStore #============================================================== org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.isClustered = true org.quartz.jobStore.clusterCheckinInterval = 10000 org.quartz.jobStore.dataSource = myDS #============================================================== #Configure DataSource #============================================================== org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL =${quartzdb.url} org.quartz.dataSource.myDS.user =${quartzdb.user} org.quartz.dataSource.myDS.password =${quartzdb.password} org.quartz.dataSource.myDS.maxConnections = 30 #============================================================== #Configure ThreadPool #============================================================== org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority = 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
simpleJobListener監聽器的代碼
package xxx.xxx.quartz.task; import lombok.extern.slf4j.Slf4j; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobListener; import java.util.Date; /** * 任務監聽器 * @author hjp * */ @Slf4j public class SimpleJobListener implements JobListener { @Override public String getName() { return "defaultJobListener"; } /** * 這個方法正常情況下不執行,但是如果當TriggerListener中的vetoJobExecution方法返回true時,那么執行這個方法. * 需要注意的是 如果方法(2)執行 那么(1),(3)這個倆個方法不會執行,因為任務被終止了嘛. * Called by the Scheduler when a JobDetail was about to be executed (an associated Trigger has occurred), * but a TriggerListener vetoed it's execution. */ @Override public void jobExecutionVetoed(JobExecutionContext arg0) { } /** * 任務執行之前執行 */ @Override public void jobToBeExecuted(JobExecutionContext arg0) { log.info("定時器:" + arg0.getJobDetail().getKey().getName() + ",開始執行了...." + new Date()); } /** * 任務執行完成后執行,jobException如果它不為空則說明任務在執行過程中出現了異常 * Called by the Scheduler after a JobDetail has been executed, and be for the associated Trigger's triggered(xx) method has been called. */ @Override public void jobWasExecuted(JobExecutionContext arg0, JobExecutionException arg1) { if(arg1 != null) { log.info("定時器:" + arg0.getJobDetail().getKey().getName() + ",執行出錯了...." + arg1.getMessage()); } log.info("定時器:" + arg0.getJobDetail().getKey().getName() + ",執行結束了...." + new Date()); } }
調用代碼
package xxx.xxx.quartz.service.impl; import xxx.xxx.core.util.DateUtils; import xxx.xxx.quartz.service.QuartzService; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.quartz.impl.triggers.CronTriggerImpl; import org.quartz.impl.triggers.SimpleTriggerImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.ParseException; import java.util.Date; import java.util.Map; /** * QuartzService * @author hjp * */ @Slf4j @Service public class QuartzServiceImpl implements QuartzService { @Autowired private Scheduler scheduler; private final static String groupName = "groupDefault"; @Override public Date addJobOne(String jobName, Class<? extends Job> cls, Long time,Map<String,String> paramMap) { try { deleteJob(jobName); SimpleTriggerImpl trigger = new SimpleTriggerImpl(); trigger.setStartTime(DateUtils.parentDate(System.currentTimeMillis() + time)); TriggerKey triggerKey = new TriggerKey("Trigger_" + jobName, groupName); trigger.setKey(triggerKey); JobBuilder jb = JobBuilder.newJob(cls); jb.withIdentity(jobName, groupName); JobDataMap map = new JobDataMap(); if(paramMap!= null) { for (String key : paramMap.keySet()) { map.put(key, paramMap.get(key)); } } jb.usingJobData(map); JobDetail job = jb.build(); Date execDate = scheduler.scheduleJob(job, trigger); return execDate; } catch (SchedulerException e) { log.error(e.getMessage()); } return null; } @Override public boolean deleteJob(String jobName) { JobKey jobKey = new JobKey(jobName, groupName); TriggerKey triggerKey = new TriggerKey("Trigger_" + jobName, groupName); try { if(scheduler.checkExists(jobKey)) { scheduler.pauseTrigger(triggerKey); scheduler.unscheduleJob(triggerKey); scheduler.deleteJob(jobKey); return true; } } catch (SchedulerException e) { log.error(e.getMessage()); } return false; } @Override public Boolean isJobExist(String jobName) { try { JobKey jobKey = new JobKey(jobName, groupName); return scheduler.checkExists(jobKey); } catch (SchedulerException e) { log.error(e.getMessage()); } return false; } /** * 添加一個定時器 通過cron確定時間 * @param jobName * @param cls * @param cron * @param paramMap * @return */ public Date addJob(String jobName, Class<? extends Job> cls, String cron,Map<String,String> paramMap) { try { JobBuilder jb = JobBuilder.newJob(cls); jb.withIdentity(jobName , groupName); JobDataMap map = new JobDataMap(); if(paramMap != null) { for (String key : paramMap.keySet()) { map.put(key, paramMap.get(key)); } } jb.usingJobData(map); CronTriggerImpl trigger = new CronTriggerImpl(); trigger.setCronExpression(cron); TriggerKey key = new TriggerKey("Trigger_" + jobName, groupName); trigger.setKey(key); return scheduler.scheduleJob(jb.build(), trigger); } catch (SchedulerException | ParseException e) { log.error(e.getMessage()); } return null; } }
