zoukankan      html  css  js  c++  java
  • Spring整合Quartz实现持久化、动态设定时间

    一、spring整合

      网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过)。

      对于spring的整合其中的任务,spring提供了几个类、接口(这些类都实现了Job接口):

      org.springframework.scheduling.quartz.QuartzJobBean

      org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.MethodInvokingJob 

      org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob

      

      QuartzJobBean和MethodInvokingJob是无状态的,StatefulMethodInvokingJob是有状态的。

      可以选择自己的需求选择继承与哪个类。 

      关于Scheduler在Spring上的配置:

    复制代码
        <bean name="quartzScheduler" lazy-init="false"
              class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
            <property name="dataSource">  
                <ref bean="dataSource" />  
            </property> 
            
            <property name="applicationContextSchedulerContextKey"  
                        value="applicationContextKey" /> 
             <property name="autoStartup" value="true" />
            <property name="configLocation" value="classpath:spring/quartz.properties"/> 
        </bean> 
    复制代码

      注意:其中lazy-init="false",和 <property name="autoStartup" value="true"/>最好按照自己的需求作统一的配置

    二、quartz.properties 配置持久化的信息

    复制代码
    # Default Properties file for use by StdSchedulerFactory
    # to create a Quartz Scheduler Instance, if a different
    # properties file is not explicitly specified.
    #
    #============================================================================
    # Configure Main Scheduler Properties
    #============================================================================
    org.quartz.scheduler.instanceName = DefaultQuartzScheduler
    org.quartz.scheduler.rmi.export = false
    org.quartz.scheduler.rmi.proxy = false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
    #============================================================================
    # 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
    #============================================================================
    # Configure JobStore
    #============================================================================
    #org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
    org.quartz.jobStore.misfireThreshold = 60000
    org.quartz.jobStore.useProperties = true
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    #havent cluster spring
    #org.quartz.jobStore.dataSource = myDS 
    org.quartz.jobStore.tablePrefix = qrtz_
    org.quartz.jobStore.isClustered = false  
    org.quartz.jobStore.maxMisfiresToHandleAtATime=1
    #==============================================================  
    #Non-Managed Configure Datasource  if you don't use spring cluster
    #==============================================================   
    #org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver   
    #org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/qrtz  
    #org.quartz.dataSource.myDS.user = root   
    #org.quartz.dataSource.myDS.password = root 
    #org.quartz.dataSource.myDS.maxConnections =10  
    复制代码

      这里要备注的是:org.quartz.jobStore.misfireThreshold = 60000

      这个属性是配置当发现触发器过时,允许做就之内的trigger任有效。对于详细了解其中的机制,可以查看数据库的变化,特别是数据库中的QRTZ_FIRED_TRIGGERS表。

      对于其状态有ACQUIRED和EXECUTING两个状态进行转化,并因此会影响QRTZ_TRIGGERS的表的数据。(个人猜想:quartz是利用这几个字段来保存断点的)

    三、下面是项目的搭建代码:

      任务类信息类JobModel  

    复制代码
    public class JobModel {
        private String jobName; 
        private String group;//对于job,trigger相互绑定的,采用相同的group 
        private Class<?> jobClass;
        private Trigger trigger;
        public JobModel() {
            super();
        }
            //.....getter,setter   
    }
    复制代码

      定义一个无状态的Job(若定义一个有状态的Job,需要继承与StatefulMethodInvokingJob)

    复制代码
    public class CommonJob extends MethodInvokingJob{
        @Override
        protected void executeInternal(JobExecutionContext context)
                throws JobExecutionException {
            System.out.println("commonJob executing ...");
            JobDataMap dataMap = context.getJobDetail().getJobDataMap();
            int value = Integer.parseInt(dataMap.getString("key"));
            System.out.println("value is " + value);
            dataMap.put("key", new Integer(++value).toString());
            
        }
    }
    复制代码

      SchedulerManager一共对在scheduler中操作job

    复制代码
    public class QrtzManager {
        private static Scheduler scheduler;
        static {
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    "applicationContext-quartz2.xml");
            scheduler = (StdScheduler) context.getBean("quartzScheduler");
        }
        public void standBy(){
            try {
                scheduler.standby();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
        public void start(){
            try {
                scheduler.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
        //add a job
        public void deploy(JobModel model,JobDataMap dataMap){
            JobDetail jobDetail = new JobDetail(model.getJobName(),model.getGroup(),model.getJobClass());
            jobDetail.setJobDataMap(dataMap);
            try {
                scheduler.scheduleJob(jobDetail,model.getTrigger());
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
        //delete a job
        public void unDeploy(String jobName,String group){
            if (jobName.equals("") || group.equals("")) {
                return ;
            }
            try {
                scheduler.deleteJob(jobName, group);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
            
        }
    }
    复制代码

    测试类

    复制代码
    package com.lps.schedulerserver.service02;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.junit.Test;
    import org.quartz.CronTrigger;
    import org.quartz.JobDataMap;
    import org.quartz.SimpleTrigger;
    import org.quartz.Trigger;
    
    public class Main {
        public static void main(String[] args) {
        
            Trigger trigger = new SimpleTrigger("trigger02", "group02", new Date(), parse("2012-12-12 18:30:00"), 5, 10000L);
            JobModel model1 = new JobModel("job01", "group01", CommonJob.class, trigger);
            String expression = "0/15 * * ? * *";
            Trigger trigger2 = null;
            try {
                trigger2 = new CronTrigger("trigger01", "group", expression);
                trigger2.setStartTime(new Date());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            JobModel model2 = new JobModel("job02","group02",StatefulJob.class,trigger2);
            QrtzManager manager = new QrtzManager();
            //jobdatamap
            JobDataMap dataMap = new JobDataMap();
            dataMap.put("key", "1");
            manager.deploy(model2, dataMap);
            System.out.println("deploy model2 at:"+new Date());
        }
        public static Date parse(String str){
            DateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
            Date date = null ;
            try {
                date = format.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return date;
        }
        @Test
        public void deleteJob(){
            QrtzManager manager = new QrtzManager();
            manager.unDeploy("job01","group01");
        }
    }
    复制代码
  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/interdrp/p/3551446.html
Copyright © 2011-2022 走看看