zoukankan      html  css  js  c++  java
  • Quartz的Properties文件解析

      将可变信息放在properties文件是使配置更加灵活

    1.文档位置和加载顺序

     1. StdSchedulerFactory默认加载quartz包下的quartz.properties文件,如果我们在项目下面新建一个quartz.properties文件,会优先加载我们的配置文件。

      quartz包下的quartz.properties文件内容:

    # Default Properties file for use by StdSchedulerFactory
    # to create a Quartz Scheduler Instance, if a different
    # properties file is not explicitly specified.
    #
    
    org.quartz.scheduler.instanceName: DefaultQuartzScheduler
    org.quartz.scheduler.rmi.export: false
    org.quartz.scheduler.rmi.proxy: false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
    
    org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount: 10
    org.quartz.threadPool.threadPriority: 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
    
    org.quartz.jobStore.misfireThreshold: 60000
    
    org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

    2.  现在我们测试我们自己在工程目录下新建一个quartz.propertis文件是否优先读取我们的配置文件:

    内容:主要是将线程数量修改为-5

    # Default Properties file for use by StdSchedulerFactory
    # to create a Quartz Scheduler Instance, if a different
    # properties file is not explicitly specified.
    #
    
    org.quartz.scheduler.instanceName: DefaultQuartzScheduler
    org.quartz.scheduler.rmi.export: false
    org.quartz.scheduler.rmi.proxy: false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
    
    org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount: -5
    org.quartz.threadPool.threadPriority: 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
    
    org.quartz.jobStore.misfireThreshold: 60000
    
    org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

    3.我们再次启动quartz任务:

    Job定义:

    package cn.qlq.quartz;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    public class HelloJob implements Job {
        
    
        public void execute(JobExecutionContext context) throws JobExecutionException {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //打印当前的时间
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date date = new Date();
            System.out.println("current exec time is :"+sf.format(date));
        }
        
    }
    package cn.qlq.quartz;
    
    import static org.quartz.JobBuilder.newJob;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.quartz.CronScheduleBuilder;
    import org.quartz.CronTrigger;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerFactory;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;
    
    public class HelloScheduler {
        public static void main(String[] args) {
            try {
                // 1. 创建一个JodDetail实例 将该实例与Hello job class绑定 (链式写法)
                JobDetail jobDetail = newJob(HelloJob.class) // 定义Job类为HelloQuartz类,这是真正的执行逻辑所在
                        .withIdentity("myJob") // 定义name/group
                        .build();
                // 打印当前的时间
                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                Date date = new Date();
                System.out.println("current time is :" + sf.format(date));
    
                // 2. 2018年内每天11点18开始执行,每隔5s执行一次
                CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                        .withIdentity("myTrigger", "group1")// 定义名字和组
                        .withSchedule(    //定义任务调度的时间间隔和次数
                                CronScheduleBuilder
                                .cronSchedule("* * * * * ? *")
                                )
                        .build();
    
                
                // 3. 创建scheduler
                SchedulerFactory sfact = new StdSchedulerFactory();
                Scheduler scheduler = sfact.getScheduler();
    
                // 4. 将trigger和jobdetail加入这个调度
                scheduler.scheduleJob(jobDetail, trigger);
    
                // 5. 启动scheduler
                scheduler.start();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    结果:  (报错,说线程数必须大于0)

    current time is :2018-04-05 12:45:55
    org.quartz.SchedulerConfigException: Thread count must be > 0
        at org.quartz.simpl.SimpleThreadPool.initialize(SimpleThreadPool.java:245)
        at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1273)
        at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1502)
        at cn.qlq.quartz.HelloScheduler.main(HelloScheduler.java:39)

    二、quartz.properties文件详解:

    1.quartz.properties组成部分

    调度器属性 线程池属性 作业存储设置 插件配置

     

    2. 调度器属性

     

    3.线程池属性

    threadCount:工作线程数量

    threadPriority:工作线程优先级

    org.quartz.threadPool.class:配置线程池实现类

    4.作业存储设置

    描述了在调度器实例的生命周期中,Job和Trigger信息是如何被存储的

    5. 插件配置

     满足特定需求用到的Quartz插件的配置

     6.最后附一个项目中常用的配置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.instanceid:AUTO
    org.quartz.scheduler.rmi.export: false
    org.quartz.scheduler.rmi.proxy: false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
    # ===========================================================================  
    # Configure ThreadPool 线程池属性  
    # ===========================================================================
    #线程池的实现类(一般使用SimpleThreadPool即可满足几乎所有用户的需求)
    org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
    #指定线程数,至少为1(无默认值)(一般设置为1-100直接的整数合适)
    org.quartz.threadPool.threadCount: 10
    #设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY 10,最小为Thread.MIN_PRIORITY 1,默认为5)
    org.quartz.threadPool.threadPriority: 5
    #设置SimpleThreadPool的一些属性
    #设置是否为守护线程
    #org.quartz.threadpool.makethreadsdaemons = false
    #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
    #org.quartz.threadpool.threadsinheritgroupofinitializingthread=false
    #线程前缀默认值是:[Scheduler Name]_Worker
    #org.quartz.threadpool.threadnameprefix=swhJobThead;
    # 配置全局监听(TriggerListener,JobListener) 则应用程序可以接收和执行 预定的事件通知
    # ===========================================================================
    # Configuring a Global TriggerListener 配置全局的Trigger监听器
    # MyTriggerListenerClass 类必须有一个无参数的构造函数,和 属性的set方法,目前2.2.x只支持原始数据类型的值(包括字符串)
    # ===========================================================================
    #org.quartz.triggerListener.NAME.class = com.swh.MyTriggerListenerClass
    #org.quartz.triggerListener.NAME.propName = propValue
    #org.quartz.triggerListener.NAME.prop2Name = prop2Value
    # ===========================================================================
    # Configuring a Global JobListener 配置全局的Job监听器
    # MyJobListenerClass 类必须有一个无参数的构造函数,和 属性的set方法,目前2.2.x只支持原始数据类型的值(包括字符串)
    # ===========================================================================
    #org.quartz.jobListener.NAME.class = com.swh.MyJobListenerClass
    #org.quartz.jobListener.NAME.propName = propValue
    #org.quartz.jobListener.NAME.prop2Name = prop2Value
    # ===========================================================================  
    # Configure JobStore 存储调度信息(工作,触发器和日历等)
    # ===========================================================================
    # 信息保存时间 默认值60秒
    org.quartz.jobStore.misfireThreshold: 60000
    #保存job和Trigger的状态信息到内存中的类
    org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
    # ===========================================================================  
    # Configure SchedulerPlugins 插件属性 配置
    # ===========================================================================
    # 自定义插件  
    #org.quartz.plugin.NAME.class = com.swh.MyPluginClass
    #org.quartz.plugin.NAME.propName = propValue
    #org.quartz.plugin.NAME.prop2Name = prop2Value
    #配置trigger执行历史日志(可以看到类的文档和参数列表)
    org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin  
    org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}  
    org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}  
    #配置job调度插件  quartz_jobs(jobs and triggers内容)的XML文档  
    #加载 Job 和 Trigger 信息的类   (1.8之前用:org.quartz.plugins.xml.JobInitializationPlugin)
    org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
    #指定存放调度器(Job 和 Trigger)信息的xml文件,默认是classpath下quartz_jobs.xml
    org.quartz.plugin.jobInitializer.fileNames = my_quartz_job2.xml  
    #org.quartz.plugin.jobInitializer.overWriteExistingJobs = false  
    org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
    #自动扫描任务单并发现改动的时间间隔,单位为秒
    org.quartz.plugin.jobInitializer.scanInterval = 10
    #覆盖任务调度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情况
    org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
    # ===========================================================================  
    # Sample configuration of ShutdownHookPlugin  ShutdownHookPlugin插件的配置样例
    # ===========================================================================
    #org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
    #org.quartz.plugin.shutdownhook.cleanShutdown = true
    #
    # Configure RMI Settings 远程服务调用配置
    #
    #如果你想quartz-scheduler出口本身通过RMI作为服务器,然后设置“出口”标志true(默认值为false)。
    #org.quartz.scheduler.rmi.export = false
    #主机上rmi注册表(默认值localhost)
    #org.quartz.scheduler.rmi.registryhost = localhost
    #注册监听端口号(默认值1099)
    #org.quartz.scheduler.rmi.registryport = 1099
    #创建rmi注册,false/never:如果你已经有一个在运行或不想进行创建注册
    # true/as_needed:第一次尝试使用现有的注册,然后再回来进行创建
    # always:先进行创建一个注册,然后再使用回来使用注册
    #org.quartz.scheduler.rmi.createregistry = never
    #Quartz Scheduler服务端端口,默认是随机分配RMI注册表
    #org.quartz.scheduler.rmi.serverport = 1098
    #true:链接远程服务调度(客户端),这个也要指定registryhost和registryport,默认为false
    # 如果export和proxy同时指定为true,则export的设置将被忽略
    #org.quartz.scheduler.rmi.proxy = false
  • 相关阅读:
    多线程中sleep方法,简单介绍。
    线程终止的四种方式,interrupt 方法使用的简单介绍。
    线程的生命周期 介绍
    线程池之 newSingleThreadExecutor 介绍
    python 中 *args he **kwargs的区别
    转载:创业者和工作谈的是一场永不分手的虐恋
    给自己一份勇气,勇敢的面对生活
    做一面锃亮的镜子吧
    与人交往时关注内容而不是表情
    最近比较需要正能量:经典励志人生感悟的句子
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8722121.html
Copyright © 2011-2022 走看看