• Quartz2.2.1操作手册


     一、初识quartz

    1 JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
    2  
    3 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().build();
    4  
    5 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    6 scheduler.scheduleJob(job, trigger);
    7 scheduler.start();
    8 scheduler.shutdown();

      认识quartz读懂这几行代码就可以了。
     
      1.JobDetail是quartz的真正意义上的job,必须指定JobDetail的name,group属性,这两个属性是JobDetail的唯一标识;
         其中HelloJob是一个implements Job的类,它是真正意义上我们的业务执行类,我们的任务逻辑实现写在execute(JOB接口唯一的方法)的方法里.
     
      2.Trigger是JobDetail的触发器,JobDetail什么时候触发,触发间隔,触发次数都由它来指定;同样Trigger的name,group属性,这两个属性是Trigger的唯一标识;
         一个JobDetail可以被多个Trigger触发.
       
      3.Scheduler将JobDetail和Trigger组合在一起进行工作,Scheduler只有调用start()的方法才会真正的启动调度;
         Scheduler可以先start()启动,再scheduleJob(JobDetail,Trigger);反之亦然,很好理解,因为调度框架启动后就可以自动去调度任务.
       
     二、JobDetail,Trigger的更方便的生成方式
      quartz给我们提供了很多便捷的操作,最简单的,静态引入:

    1  import static org.quartz.JobBuilder.*;
    2  import static org.quartz.SimpleScheduleBuilder.*;
    3  import static org.quartz.CronScheduleBuilder.*;
    4  import static org.quartz.CalendarIntervalScheduleBuilder.*;
    5  import static org.quartz.TriggerBuilder.*;
    6  import static org.quartz.DateBuilder.*;

      这样,newJob,newTrigger,cronSchedule等一系列方便的方法就可以直接使用了.因为quartz的CronTrigger几乎可以满足所有的开发需求,
      所以我的Trigger全部采用CronTrigger来实现,只需生成对应的cron表达式.
     
      三、细谈Job,JobDetail
      一个简单的Job如下,事实上复杂的也是这样,只是区别于execute方法体:

    1 public class HelloJob implements Job {
    2     public HelloJob() {}
    3     public void execute(JobExecutionContext context) throws JobExecutionException{
    4       System.err.println("Hello!  HelloJob is executing.");
    5     }
    6 }

      如果你想给JobDetail传入参数,可以获取dataMap,并向其中随意put,建议所有属性都为String类型:

    1 jobDetail.getJobDataMap().put(JOB_DATA_KEY,JSONObject.toJSONString(Object));  

      如果你想给Trigger传入参数,同样可以获取dataMap,不过这是JobDetail的,要知道trigger本身不需要任何参数,都是为JobDetail服务:

    1 trigger.getJobDataMap().put(JOB_DATA_KEY, JSONObject.toJSONString(Object));  

      这样在你的execute方法里你就可以获取刚刚添加的所有参数,建议获取所有的:

    1 context.getMergedJobDataMap().getString("paramName");  

      四、监听Trigger,监听JobDetail
     
      很简单
      1.创建自己的Listener:

    1 public class McTriggerListener extends TriggerListenerSupport
    2 public class McJobListener extends JobListenerSupport 

      2.scheduler获取ListenerManager添加自己的listener即可:

    1  scheduler.getListenerManager().addJobListener(mcJobListener, allJobs());
    2  scheduler.getListenerManager().addTriggerListener(triggerListener);

      因为我需要记录任务执行成功失败,记录成功失败条数,失败原因,执行完成后更新状态,所以这里先将监听器摆出来,监听器执行的顺序:

    1 TriggerListenerSupport.triggerFired()
    2 JobListenerSupport.jobToBeExecuted()
    3 Job.execute()
    4 JobListenerSupport.jobWasExecuted()
    5 TriggerListenerSupport.triggerComplete()  

      这样你就可以随意的统计,或者在任务执行前后做自己想做的事情,我觉得这是很重要的.
     
      五、将quartz引入web项目
     
      1.如果web项目不将quartz的Scheduler先实例化并启动,那么quartz的生命周期将无法与web容器同步,导致的结果就是项目停了任务还在继续跑,项目起了任务
        不执行,还需要人工执行start()方法,我这里没有用spring,在web.xml中初始化:

     1 <!-- Quartz -->
     2 <servlet>
     3     <servlet-name>QuartzInitializer</servlet-name>
     4     <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
     5     <init-param>
     6         <param-name>config-file</param-name>
     7         <param-value>/quartz.properties</param-value>
     8     </init-param>
     9     <init-param>
    10         <param-name>shutdown-on-unload</param-name>
    11         <param-value>true</param-value>
    12     </init-param>
    13    <load-on-startup>2</load-on-startup>
    14 </servlet>

      2.当然了你需要配置quartz的属性文件,扔到maven的resources下即可,很简单如下:

     1 org.quartz.scheduler.instanceName: MainScheduler     //实例名称
     2 org.quartz.scheduler.instanceId: instance_one        //实例Id,集群时请设置不同的Id
     3 
     4 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool     //使用quartz线程池
     5 org.quartz.threadPool.threadCount = 10
     6 org.quartz.threadPool.threadPriority = 5
     7 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
     8 
     9 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX     //使用数据库持久化
    10 org.quartz.jobStore.tablePrefix = QRTZ_   //表前缀,所需要的表在quartz下载的包中可以找到
    11 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    12 org.quartz.jobStore.dataSource = qzDS     //数据源
    13 org.quartz.jobStore.useProperties=true    //参数类型只能为String
    14 org.quartz.jobStore.isClustered=false     //是否集群
    15 
    16 org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
    17 org.quartz.dataSource.qzDS.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8
    18 org.quartz.dataSource.qzDS.user = root
    19 org.quartz.dataSource.qzDS.password = 123456
    20 org.quartz.dataSource.qzDS.maxConnections = 30

      3.web启动时自动初始化scheduler,并将其放在ServletContext中,并调用它的start()方法,程序可直接获取此实例,万事俱备:

    1 SchedulerFactory sf = (SchedulerFactory)servletContext.getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
    2 Scheduler scheduler = sf.getScheduler();

      六、到这步quartz的框框就搭起来了,你可以自己写个管理类,负责添加,修改,暂停,重启,删除Job,比较简单.
     
      quartz官方文档写的已经很详细了,写这篇博客的目的是为了让初学的同学能尽快上手,上手之后再查阅官方文档的一些具体说明,就会事半功倍.

      喜欢请关注微信公众号:码农小麦

  • 相关阅读:
    # 类和模板小结
    # Clion复制提示信息
    # IDEA相关知识
    # MySQL 笔记
    # MATLAB笔记
    # Mac地址
    # 丢包&&掉帧&&文件删除
    HDU 5744 Keep On Movin
    POJ 1852 Ants
    HDU 2795 Billboard
  • 原文地址:https://www.cnblogs.com/render-inside/p/5654206.html
Copyright © 2020-2023  润新知