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&amp;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的配置信息跟上一篇的配置信息基本一致,然后点击运行即可。

    本实例中当运行的任务在暂停的情况下,一旦重新恢复,会将暂停期间的任务运行如图:

源码链接: https://github.com/albert-liu435/springquartz

posted on 2020-01-20 17:25  海之浪子  阅读(161)  评论(0编辑  收藏  举报

导航