Quartz 之 Job参数 和 Job状态

2023-10-31

项目地址:  

         https://github.com/yuleiqq/quartz_example/tree/master/quartz_study

此示例旨在演示如何将运行时参数传递给quartz作业,以及如何维护作业中的状态。

程序将执行以下操作:

  • 启动Quartz调度器

  • 调度两个作业,每个作业将执行总共10秒一次

  • 调度程序将向第一个作业实例传递一个运行时作业参数“Green”

  • 调度程序将把运行时作业参数“Red”传递给第二个作业实例

  • 程序将等待60秒,以便两个作业有足够的时间运行

  • 关闭调度程序

本例中的代码由以下类组成:

JobStateExample :  主运行程序

ColorJob:一个简单的作业,打印一个最喜欢的颜色(作为运行时参数传入)并显示它的执行计数。

针对ColorJob,需要加如下两个注解,否则持久存储不会生效

@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class ColorJob implements Job {

话不多人,直接贴代码,看运行效果吧

ColorJob.java 

package com.example05;

import java.util.Date;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>
 * This is just a simple job that receives parameters and
 * maintains state
 * </p>
 * 
 * @author Bill Kratzer
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class ColorJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(ColorJob.class);
    
    // parameter names specific to this job
    public static final String FAVORITE_COLOR = "favorite color";
    public static final String EXECUTION_COUNT = "count";
    
    // Since Quartz will re-instantiate a class every time it
    // gets executed, members non-static member variables can
    // not be used to maintain state!
    private int _counter = 1;

    /**
     * <p>
     * Empty constructor for job initialization
     * </p>
     * <p>
     * Quartz requires a public empty constructor so that the
     * scheduler can instantiate the class whenever it needs.
     * </p>
     */
    public ColorJob() {
    }

    /**
     * <p>
     * Called by the <code>{@link org.quartz.Scheduler}</code> when a
     * <code>{@link org.quartz.Trigger}</code> fires that is associated with
     * the <code>Job</code>.
     * </p>
     * 
     * @throws JobExecutionException
     *             if there is an exception while executing the job.
     */
    public void execute(JobExecutionContext context)
        throws JobExecutionException {

        // This job simply prints out its job name and the
        // date and time that it is running
        JobKey jobKey = context.getJobDetail().getKey();
        
        // Grab and print passed parameters
        JobDataMap data = context.getJobDetail().getJobDataMap();
        String favoriteColor = data.getString(FAVORITE_COLOR);
        int count = data.getInt(EXECUTION_COUNT);
        _log.info("ColorJob: " + jobKey + " executing at " + new Date() + "\n" +
            "  favorite color is " + favoriteColor + "\n" + 
            "  execution count (from job map) is " + count + "\n" + 
            "  execution count (from job member variable) is " + _counter);
        
        // increment the count and store it back into the 
        // job map so that job state can be properly maintained
        count++;
        data.put(EXECUTION_COUNT, count);
        
        // Increment the local member variable 
        // This serves no real purpose since job state can not 
        // be maintained via member variables!
        _counter++;
    }

}
JobStateExample.java 
package com.example05;

import static org.quartz.DateBuilder.nextGivenSecondDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 * This Example will demonstrate how job parameters can be passed into jobs and how state can be maintained
 * 
 * @author Bill Kratzer
 */
public class JobStateExample {

  public void run() throws Exception {
    Logger log = LoggerFactory.getLogger(JobStateExample.class);

    log.info("------- Initializing -------------------");

    // First we must get a reference to a scheduler
    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();

    log.info("------- Initialization Complete --------");

    log.info("------- Scheduling Jobs ----------------");

    // get a "nice round" time a few seconds in the future....
    Date startTime = nextGivenSecondDate(null, 10);

    // job1 will only run 5 times (at start time, plus 4 repeats), every 10 seconds
    JobDetail job1 = newJob(ColorJob.class).withIdentity("job1", "group1").build();

    SimpleTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
        .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();

    // pass initialization parameters into the job
    job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");
    job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);

    // schedule the job to run
    Date scheduleTime1 = sched.scheduleJob(job1, trigger1);
    log.info(job1.getKey() + " will run at: " + scheduleTime1 + " and repeat: " + trigger1.getRepeatCount()
             + " times, every " + trigger1.getRepeatInterval() / 1000 + " seconds");

    // job2 will also run 5 times, every 10 seconds
    JobDetail job2 = newJob(ColorJob.class).withIdentity("job2", "group1").build();

    SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(startTime)
        .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();

    // pass initialization parameters into the job
    // this job has a different favorite color!
    job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");
    job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);

    // schedule the job to run
    Date scheduleTime2 = sched.scheduleJob(job2, trigger2);
    log.info(job2.getKey().toString() + " will run at: " + scheduleTime2 + " and repeat: " + trigger2.getRepeatCount()
             + " times, every " + trigger2.getRepeatInterval() / 1000 + " seconds");

    log.info("------- Starting Scheduler ----------------");

    // All of the jobs have been added to the scheduler, but none of the jobs
    // will run until the scheduler has been started
    sched.start();

    log.info("------- Started Scheduler -----------------");

    log.info("------- Waiting 60 seconds... -------------");
    try {
      // wait five minutes to show jobs
      Thread.sleep(60L * 1000L);
      // executing...
    } catch (Exception e) {
      //
    }

    log.info("------- Shutting Down ---------------------");

    sched.shutdown(true);

    log.info("------- Shutdown Complete -----------------");

    SchedulerMetaData metaData = sched.getMetaData();
    log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

  }

  public static void main(String[] args) throws Exception {

    JobStateExample example = new JobStateExample();
    example.run();
  }

}

执行后,结果如下:

[INFO] 24 三月 06:12:08.584 下午 main [com.example05.JobStateExample]
------- Initializing -------------------

[INFO] 24 三月 06:12:08.662 下午 main [org.quartz.impl.StdSchedulerFactory]
Using default implementation for ThreadExecutor

[INFO] 24 三月 06:12:08.691 下午 main [org.quartz.core.SchedulerSignalerImpl]
Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

[INFO] 24 三月 06:12:08.691 下午 main [org.quartz.core.QuartzScheduler]
Quartz Scheduler v.2.3.0 created.

[INFO] 24 三月 06:12:08.693 下午 main [org.quartz.simpl.RAMJobStore]
RAMJobStore initialized.

[INFO] 24 三月 06:12:08.694 下午 main [org.quartz.core.QuartzScheduler]
Scheduler meta-data: Quartz Scheduler (v2.3.0) 'MyScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 20 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.


[INFO] 24 三月 06:12:08.695 下午 main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

[INFO] 24 三月 06:12:08.695 下午 main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler version: 2.3.0

[INFO] 24 三月 06:12:08.695 下午 main [com.example05.JobStateExample]
------- Initialization Complete --------

[INFO] 24 三月 06:12:08.695 下午 main [com.example05.JobStateExample]
------- Scheduling Jobs ----------------

[INFO] 24 三月 06:12:08.716 下午 main [com.example05.JobStateExample]
group1.job1 will run at: Tue Mar 24 18:12:10 CST 2020 and repeat: 4 times, every 10 seconds

[INFO] 24 三月 06:12:08.716 下午 main [com.example05.JobStateExample]
group1.job2 will run at: Tue Mar 24 18:12:10 CST 2020 and repeat: 4 times, every 10 seconds

[INFO] 24 三月 06:12:08.716 下午 main [com.example05.JobStateExample]
------- Starting Scheduler ----------------

[INFO] 24 三月 06:12:08.717 下午 main [org.quartz.core.QuartzScheduler]
Scheduler MyScheduler_$_NON_CLUSTERED started.

[INFO] 24 三月 06:12:08.717 下午 main [com.example05.JobStateExample]
------- Started Scheduler -----------------

[INFO] 24 三月 06:12:08.717 下午 main [com.example05.JobStateExample]
------- Waiting 60 seconds... -------------

[INFO] 24 三月 06:12:10.018 下午 MyScheduler_Worker-1 [com.example05.ColorJob]
ColorJob: group1.job1 executing at Tue Mar 24 18:12:10 CST 2020
  favorite color is Green
  execution count (from job map) is 1
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:10.020 下午 MyScheduler_Worker-2 [com.example05.ColorJob]
ColorJob: group1.job2 executing at Tue Mar 24 18:12:10 CST 2020
  favorite color is Red
  execution count (from job map) is 1
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:20.010 下午 MyScheduler_Worker-3 [com.example05.ColorJob]
ColorJob: group1.job1 executing at Tue Mar 24 18:12:20 CST 2020
  favorite color is Green
  execution count (from job map) is 2
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:20.010 下午 MyScheduler_Worker-4 [com.example05.ColorJob]
ColorJob: group1.job2 executing at Tue Mar 24 18:12:20 CST 2020
  favorite color is Red
  execution count (from job map) is 2
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:30.000 下午 MyScheduler_Worker-5 [com.example05.ColorJob]
ColorJob: group1.job1 executing at Tue Mar 24 18:12:30 CST 2020
  favorite color is Green
  execution count (from job map) is 3
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:30.000 下午 MyScheduler_Worker-6 [com.example05.ColorJob]
ColorJob: group1.job2 executing at Tue Mar 24 18:12:30 CST 2020
  favorite color is Red
  execution count (from job map) is 3
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:40.001 下午 MyScheduler_Worker-7 [com.example05.ColorJob]
ColorJob: group1.job1 executing at Tue Mar 24 18:12:40 CST 2020
  favorite color is Green
  execution count (from job map) is 4
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:40.002 下午 MyScheduler_Worker-8 [com.example05.ColorJob]
ColorJob: group1.job2 executing at Tue Mar 24 18:12:40 CST 2020
  favorite color is Red
  execution count (from job map) is 4
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:50.001 下午 MyScheduler_Worker-9 [com.example05.ColorJob]
ColorJob: group1.job1 executing at Tue Mar 24 18:12:50 CST 2020
  favorite color is Green
  execution count (from job map) is 5
  execution count (from job member variable) is 1

[INFO] 24 三月 06:12:50.002 下午 MyScheduler_Worker-10 [com.example05.ColorJob]
ColorJob: group1.job2 executing at Tue Mar 24 18:12:50 CST 2020
  favorite color is Red
  execution count (from job map) is 5
  execution count (from job member variable) is 1

[INFO] 24 三月 06:13:08.718 下午 main [com.example05.JobStateExample]
------- Shutting Down ---------------------

[INFO] 24 三月 06:13:08.718 下午 main [org.quartz.core.QuartzScheduler]
Scheduler MyScheduler_$_NON_CLUSTERED shutting down.

[INFO] 24 三月 06:13:08.718 下午 main [org.quartz.core.QuartzScheduler]
Scheduler MyScheduler_$_NON_CLUSTERED paused.

[INFO] 24 三月 06:13:09.104 下午 main [org.quartz.core.QuartzScheduler]
Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.

[INFO] 24 三月 06:13:09.104 下午 main [com.example05.JobStateExample]
------- Shutdown Complete -----------------

[INFO] 24 三月 06:13:09.104 下午 main [com.example05.JobStateExample]
Executed 10 jobs.

由结果可以看出,存储在JobDataMap 中的count 状态每次递增加1,成员变量的 _counter 没有变化,因为job 每次执行都会重新创建一个Job类.

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quartz 之 Job参数 和 Job状态 的相关文章

随机推荐

  • Flutter 设置Container高度自适应GridView和ListView

    参考 1 去掉Container的高度 2 添加下面语句 physics NeverScrollableScrollPhysics shrinkWrap true 完整代码如下 Widget imageSection1 imgPath im
  • ns3链路拥塞实验

    实验目的 收集和分析不同背景流下的路径丢包率与时延性能 拓扑结构 仿真网络拓扑 n0 n5 10 Mb s 2ms n1 n3 10Mb s 10ms n4 n6 n2 n7
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • css 预处理器

    由于多个项目中用到了sass和less 所以就学习了一下相关知识 记录下来方便随时查看 前言 css是用来编写网站样式 但是 其写法比较一成不变 如果想要使用 css 实现 js 一样的变量 常量等 就会比较臃肿 难以维护 所以 作为css
  • 使jira支持reopen率的统计

    jira本身并不能统计bug的reopen率 虽然bug工作流程中有reopen节点 只能借助第三方插件来处理 插件名称 Enhancer Plugin for JIRA 此插件支持自定义字段 自定义计数器等等高级操作 在插件管理中搜索插件
  • docker基础3——制作镜像(基于容器)

    文章目录 一 基本了解 1 1 镜像结构 1 2 docker存储驱动 1 2 1 AUFS 1 2 2 OverlayFS 1 2 3 DeviceMapper 1 3 镜像仓库 二 镜像制作 2 1 基于容器制作镜像 三 镜像导入与导出
  • 双指针的实践

    一 原理 双指针 指的是在遍历对象的过程中 不是普通的使用单个指针进行访问 而是使用两个相同方向 快慢指针 或者相反方向 对撞指针 的指针进行扫描 从而达到相应的目的 换言之 双指针法充分使用了数组有序这一特征 从而在某些情况下能够简化一些
  • 第四章 频域滤波(傅里叶变换频域显示特性)

    一 傅里叶变换频域显示特性 在光学傅里叶变换中 人们已经习惯变换域中 的低谱部分位于中央 频域频谱分布中间低 周围高的特性 有利于频谱的解析和进行各种计算与分析 1 图像中心化 借助傅里叶变换的周期性和频率位移性质 可以对频域进行换位以使频
  • Navicat 11连接MYSQL 8.0问题

    一 问题 MySQL8 0 来使用的时候 通过sqlyog 或者程序中连接数据库时 提示 Authentication plugin caching sha2 password cannot be loaded 的错误 8 0改变了身份验证
  • 第三大的数、字符串中的单词数、排列硬币

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 百日刷题计划 第 16 100 天 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 大连棒棰岛
  • hbase集群在启动的时候报错:JAVA_HOME is not set and Java could not be found

    hbase集群在启动的时候报错 JAVA HOME is not set and Java could not be found 出现这种错误 一般应该是hbase下conf文件下的hbase env sh文件中的java home的环境变
  • 信息学奥赛一本通 1224:最大子矩阵

    题目链接 ybt 1224 最大子矩阵 ybt 1282 最大子矩阵 OpenJudge 2 6 1768 最大子矩阵 洛谷 P1719 最大加权矩形 题目考点 1 动态规划 线性动规 最大子段和 2 前缀和 解题思路 求二维最大子矩阵和
  • Android扫描银行卡获取银行卡号

    card io开源的银行卡扫描的三方库真的是很好用啊 首先需要在你的module的gradle的依赖文件中添加依赖 compile io card android sdk 5 5 1 2 清单文件中加入如下Activity
  • 腾讯云Linux服务器如何安装Nginx?(CentOS 8)

    安装及配置 Nginx 执行以下命令 安装 Nginx 说明 本文以安装 Nginx 1 18 0 为例 您可通过 Nginx 官方安装包 获取适用于 CentOS 8的更多版本 dnf y install http nginx org p
  • 跨站请求伪造CSRF(Cross-site request forgery)

    目录 一 什么是CSRF 二 可能存在CSRF攻击的三个条件 一个相关的动作 基于 Cookie 的会话处理 没有不可预测的请求参数 二 常见的CSRF攻击 1 CSRF令牌的验证取决与请求方法 2 CSRF令牌的验证取决与令牌是否存在 3
  • 基于C#开发的,支持多平台二维图表开源编辑器

    推荐一个基于C 开发的 支持多平台的二维图表开源编辑器 01 项目简介 Core2D是一个支持跨平台 多平台的应用程序 内置wyswig矢量图形编辑器 可用于数据驱动生成二维图 1 wyswig矢量图形编辑器 内置了一个强大的图形编辑器 它
  • 从小白到高手---api接口和drf(Django Rest_Framework)使用超详解

    1 api接口 为了在团队内部形成共识 防止个人习惯差异引起的混乱 我们需要找到一种大家都觉得很好的接口实现规范 而且这种规范能够让后端写的接口 用途一目了然 减少双方之间的合作成本 目前市面上大部分公司开发人员使用的接口服务架构主要有 r
  • Java IO File类中的知识点

    public class Demo3 public static void main String args TODO Auto generated method stub test1 1 名称 test2 2 判断信息 test3 创建删
  • ggplot2杂记

    ggplot2杂记 本文是我在阅读 lt
  • Quartz 之 Job参数 和 Job状态

    项目地址 https github com yuleiqq quartz example tree master quartz study 此示例旨在演示如何将运行时参数传递给quartz作业 以及如何维护作业中的状态 程序将执行以下操作