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; } }