Spring整合Quartz
-
Spring整合Quartz
前面已经介绍了Quartz框架,这次我们使用Spring整合Quartz开发,本实例采用数据库模式的demo。
xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!--加载数据库连接的配置文件--> <!--<context:property-placeholder location="jdbc.properties"></context:property-placeholder>--> <!-- c3p0:数据源配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/quartz?Unicode=true&characterEncoding=UTF-8"/> <property name="user" value="root"/> <property name="password" value="root"/> <property name="initialPoolSize" value="3"/> <property name="minPoolSize" value="2"/> <property name="maxPoolSize" value="10"/> <property name="maxIdleTime" value="60"/> <property name="acquireRetryDelay" value="1000"/> <property name="acquireRetryAttempts" value="10"/> <property name="preferredTestQuery" value="SELECT 1"/> </bean> <bean id="quartzScheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="quartz.properties"></property> <!-- <property name="triggers"></property>--> </bean> </beans>
public class SimpleJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println(new Date()+"执行SimpleJob"); } }
public class ApplicationContextTest { public static Scheduler scheduler; public static void main(String[] args) throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationcontext-trigger.xml"); scheduler = (Scheduler) applicationContext.getBean("quartzScheduler"); //SimpleJob simpleJob = new SimpleJob(); scheduler.start(); //从数据库中获取相应的job及调度信息 //JobDetail jobDetail = scheduler.getJobDetail(new JobKey("trigger1", "trigger1")); //resumeJob(jobDetail.getKey().getName(), jobDetail.getKey().getGroup()); //添加job执行 addJob("trigger1", "trigger1", "job1", "job2", "0/20 * * * * ?", SimpleJob.class, new HashMap<>()); Thread.sleep(60 * 1000); //重新设置调度时间 System.out.println("重新设置调度时间"); rescheduleJob("trigger1","trigger1","0/10 * * * * ?"); Thread.sleep(60 * 1000); //暂停调度 System.out.println("暂停调度"); pauseJob("trigger1","trigger1"); Thread.sleep(60 * 1000); System.out.println("恢复调度"); resumeJob("trigger1","trigger1"); Thread.sleep(60 * 1000); System.out.println("删除调度"); removeJob("trigger1","trigger1"); Thread.sleep(60 * 1000); System.out.println(scheduler); } /** * 添加job执行 * * @param triggerKeyName * @param triggerKeyGroup * @param jobName * @param jobGroup * @param cronExpression * @param jobClass * @param jobData * @return * @throws Exception */ public static boolean addJob(String triggerKeyName, String triggerKeyGroup, String jobName, String jobGroup, String cronExpression, Class<? extends Job> jobClass, Map<String, Object> jobData) throws Exception { JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(triggerKeyName, triggerKeyGroup).build(); Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).withIdentity(triggerKeyName, triggerKeyGroup).build(); if (jobData != null && jobData.size() > 0) { JobDataMap jobDataMap = jobDetail.getJobDataMap(); jobDataMap.putAll(jobData); // JobExecutionContext context.getMergedJobDataMap().get("mailGuid"); } scheduler.scheduleJob(jobDetail, trigger); // if (!scheduler.isShutdown()) { // scheduler.start(); // } return true; } /** * 重新设置job执行 * @param triggerKeyName * @param triggerKeyGroup * @param cronExpression * @return * @throws SchedulerException */ public static boolean rescheduleJob(String triggerKeyName, String triggerKeyGroup, String cronExpression) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, triggerKeyGroup); if (scheduler.checkExists(triggerKey)) { Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).withIdentity(triggerKey).build(); scheduler.rescheduleJob(triggerKey, trigger); } return true; } /** * 删除job * @param triggerKeyName * @param triggerKeyGroup * @return * @throws SchedulerException */ public static boolean removeJob(String triggerKeyName, String triggerKeyGroup) throws SchedulerException { // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, triggerKeyGroup); boolean result = false; if (scheduler.checkExists(triggerKey)) { result = scheduler.unscheduleJob(triggerKey); } return result; } /** * 暂停job * @param triggerKeyName * @param triggerKeyGroup * @return * @throws SchedulerException */ public static boolean pauseJob(String triggerKeyName, String triggerKeyGroup) throws SchedulerException { // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, triggerKeyGroup); boolean result = false; if (scheduler.checkExists(triggerKey)) { scheduler.pauseTrigger(triggerKey); result = true; } else { } return result; } /** * 重启job * @param triggerKeyName * @param triggerKeyGroup * @return * @throws SchedulerException */ public static boolean resumeJob(String triggerKeyName, String triggerKeyGroup) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, triggerKeyGroup); boolean result = false; if (scheduler.checkExists(triggerKey)) { scheduler.resumeTrigger(triggerKey); result = true; } else { } return result; } }
quart.properties的配置信息跟上一篇的配置信息基本一致,然后点击运行即可。
本实例中当运行的任务在暂停的情况下,一旦重新恢复,会将暂停期间的任务运行如图: