带你浅谈下Quartz的简单使用

news2024/12/27 15:25:50

Scheduler 每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题(jobDetail的实例也是新的)

Quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执行,如果定时任务执行太长,会长时间占用资源,导致其它任务堵塞

@
DisallowConcurrentExecution: job类上,禁止并发地执行同一个job定义 (JobDetail定义的)的多个实例。

在这里插入图片描述

  • scheduler:可以理解为定时任务的工作容器或者说是工作场所,所有定时任务都是放在里面工作,可以开启和停止。
  • trigger:可以理解为是定时任务任务的工作规则配置,例如说,没个几分钟调用一次,或者说指定每天那个时间点执行。
  • jobDetail:定时任务的信息,例如配置定时任务的名字,群组之类的。
  • job:定时任务的真正的业务处理逻辑的地方。

简单示例

TestClient.Java

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")  //设置JOB的名字和组
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

TaskJob.Java

import cn.hutool.core.date.DateUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("TaskJob => " + DateUtil.now());
    }
}

在这里插入图片描述

usingJobData

通过 usingJobData 往定时任务中传递参数

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

TaskJob.java

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        JobDataMap triggerMap = context.getTrigger().getJobDataMap();
        JobDataMap mergeMap = context.getMergedJobDataMap();


        System.out.println("jobDataMap => " + jobDataMap.getString("job"));
        System.out.println("triggerMap => " + triggerMap.getString("trigger"));
        System.out.println("mergeMap => " + mergeMap.getString("trigger"));
    }
}

在这里插入图片描述

通过 属性赋值

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .usingJobData("name","jobDetail1.name.Value") //通过 setName 自动赋值
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,会覆盖 JobDetail
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

import org.quartz.*;

public class TaskJob implements Job {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("name => " + name);
    }
}

非并发执行

@
DisallowConcurrentExecution job类上,禁止并发地执行同一个job定义 (JobDetail定义的)的多个实例。

import cn.hutool.core.date.DateUtil;
import org.quartz.*;

@DisallowConcurrentExecution
public class TaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("Time => " + DateUtil.now());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@
PersistJobDataAfterExecution
持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是

import cn.hutool.core.date.DateUtil;

import org.quartz.*;

//持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是
@PersistJobDataAfterExecution
public class TaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) {
        JobDataMap triggerMap = context.getJobDetail().getJobDataMap();
        triggerMap.put("count", triggerMap.getInt("count") + 1);
        System.out.println("Time => " + DateUtil.now() + " count =>" + triggerMap.getInt("count"));

    }
}

Client

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .usingJobData("name","jobDetail1.name.Value") //通过 setName 自动赋值
                .usingJobData("count",0) //通过 setName 自动赋值
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,会覆盖 JobDetail
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++|物联网开发入门+项目实战|C语言基础|养成好习惯---规范编码方法 -学习笔记(5)

文章目录 养成好习惯---规范编码方法为什么规范编码很重要推荐书籍:规范编码的重要性规范编码,从Tab键开始代码行的规范写法空行和空格,让你的代码更赏心悦目空格空行 谈谈C代码的注释注释符位置 好代码,取名很重要商业代码基本要求&#xff…

Unity 热更新基础HybridCLR:安装部署(HybridCLR手记二)

Win 下 打包时遇到 xxxx\il2cpp\libil2cpp\utils\Il2CppHashMap.h(71): error C2039: hash_compare: is not a member of stdext 这是.net 7发布后最新版本vs改动打破了一些向后兼容性引起。你可以回退2022的旧版本或者使用2019之类的版本。 所以建议使用.net 6 之前的版本进行…

面试官:String s = new String(“xyz“) 创建了几个对象?

这个问题相信每个学习 java 的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必…

Django项目部署在服务器(配置Django+Mysql8.0+Python+Nginx+uWsgi)

Django项目部署在服务器(配置DjangoMysql8.0PythonNginxuWsgi) 项目配置版本服务器阿里云CentOS 7.6数据库Mysql8.0Python3.7.1 一、更新yum并设置自动更新 1、手动更新yum yum update -y2、安装自动更新的插件 yum install -y yum-cron3、设置自动…

面试官:项目中如何解决跨域问题(HttpClient、注解、网关)

为什么会有跨域问题 因为浏览器的同源政策,就会产生跨域。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的…

kafka安装及配置过程

kafka安装及配置过程 kafka 依赖于 zookeeper,zookeeper的安装可看:ZooKeeper的安装和配置过程 先说明一下,集群主机分别是:192.168.127.129,192.168.127.130,192.168.127.131 安装 kafka可以通过官网下…

Polardb 如何替换MYSQL 之 IMCI 列式(2)系统的核心与关键

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群。 本期继续上…

如何docker安装es和kibana以及ik分词器

推荐用portainer进行可视化 1.创建网络--让es和kibana容器互联 docker network create es-net 2.部署单点es docker run -d \ --name es \ -e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ -e "discovery.typesingle-node" \ -v es-data:/usr/sha…

Java垃圾回收机制

Java垃圾回收机制 垃圾回收算法为什么垃圾回收回收哪些内存如何回收Marking-Sweep(标记-清除法)Marking-Compat(标记-整理法) 内存分代年轻代 Minor gc和Major gc的区别常见回收器Serial Garbage CollectorParallel Garbage Colle…

InnoDB的表空间

独立表空间结构 区概念 连续的64个页就是一个区,也就是说一个区默认用1MB空间大小。表空间由若干个连续的区(物理位置上的连续)组成的,256的区被划分成一组。 其中,extent0~extent256个区算是第一组,exten…

基于微信小程序的家政服务预约系统的设计与实现

基于微信小程序的家政预约系统,有效解决了人们网上随时预约家政服务的问题。依托于新的小程序开发环境,解决了"跨系统开发"这个难题,在一个"类操作底层"开发基于微信小程序的家政服务应用。功能模块包括:家政服务项目展示模块,服务报价模块,用户留言评价模…

零门槛,手把手教你玩转ChatGPT,顺滑般国内使用chatGPT

国内是可以玩ChatGPT的,只需要去官网注册一个OpenAI帐号,然后使用第三方接码平台获取短信验证码,就可以成功注册帐号,注册成功之后国内就可以随意使用chatGPT啦。 国内怎么玩chatGPT如下: 官方原版 一、注册OpenAI账…

ansible——编写循环和条件任务

环境:RH294 1. 以student用户的身份并使用student作为密码登录workstation ssh studentworkstation 在workstation上,运行lab control-flow start命令,此命令会创建control-flow工作目录 lab control-flow start 2. 切换到/home/studen…

Python中PIL库的常用用法示例

Python中的PIL(Python Imaging Library,已更名为Pillow)是一个功能强大的图像处理库。以下是一些常用的PIL功能及相应的代码示例: 1. 打开和保存图像: from PIL import Image# 打开图像 image Image.open("exam…

B+G双轮驱动,税友股份迎来数字化东风

配图来自Canva可画 不知不觉之间,国内的数字经济已经蔚然成潮。据相关部门的统计数据显示,去年国内数字经济规模已经达到了50万亿,占到了国内GDP总量的40%以上,增速更是持续领先于GDP增速。与此同时,随着数字中国战略…

权限提升:网站漏洞(提权思路.)

权限提升:网站漏洞 权限提升简称提权,由于操作系统都是多用户操作系统,用户之间都有权限控制,比如通过 Web 漏洞拿到的是 Web 进程的权限,往往 Web 服务都是以一个权限很低的账号启动的,因此通过 Webshell …

The Foundry Modo 16 for Mac v16.1v3 含历史版本

The Foundry MODO是一个功能强大的3D建模、动画和渲染软件,被广泛应用于游戏开发、电影制作、产品设计和建筑可视化等领域。 以下是一些MODO的优点: 1. 强大的建模工具:MODO提供了一系列丰富的建模工具,包括多边形建模、NURBS建…

mysql索引失效的坑

目录 前言 博客文章分享 对索引字段做函数操作 隐式类型转换 隐式字符编码转换 原因分析 解决方法: 前言 在MySQL中,有时候会因为语句使用不当导致sql不走索引,从而使数据库的压力变大。本篇分享一下sql不走索引的坑,让大家…

Nginx 和Rewrite

系列文章目录 文章目录 系列文章目录一、常规的nginx正则表达式1.location和rewrite的区别2.常用的nginx的正则表达式3.nginx里面的优先级 二、rewrite1.Rewrite2.实验 总结 一、常规的nginx正则表达式 1.location和rewrite的区别 从功能看 rewrite 和 location 似乎有点像&a…

GPT-2隐私泄露论文阅读:Extracting Training Data from Large Language Models

文章目录 论文地址:原文阐释:渔樵问对:原理梗概预防策略隐私策略这个新颖的攻击方式是什么?三种典型采样策略:隐私风险文章第5页第二段中提到的 memorized training exam ple 是什么意思 ThreatModel &Ethics什么是文本的zlib…