Quartz定时任务的基本搭建

前言

个人地址:Quartz定时任务的基本搭建

Quartz是一个完全由Java编写的开源作业调度框架,为在java应用程序中进行作业调度提供了简单又强大的机制。

Quartz中分为几个核心概念:

  1. Job - 表示一个工作(任务),要执行的具体内容。
  2. JobDetail - 表示一个具体的可执行的调度程序,而Job就是这个可执行程序所要执行的内容,另外该调度程序还包含了任务的调度方案和策略。
  3. Trigger - 代表一个调度参数的配置(什么时候去调用)。
  4. Scheduler - 代表一个调度容器,一个调度容器可以注册多个“JobDetail”和"Trigger"。当“JobDetail”与“Trigger”组合在一起,就可以被“Scheduler”容器所调度了。

正式开始学习

正文即将开始兄弟别跑,跑了就不介绍小姐姐给你认识了。(/▽╲)
image.png

😌搭建项目环境

Tips: 看到这里,默认各位都是老司机了,项目创建就不占用朋友撩妹时间了。💯

转入正题 ===》 💞
既然要学习Quartz第一步肯定是引入相关的依赖包,需要的依赖我列在下面各位英雄自行摘取 ~~

<!-- 如果是springboot项目呢, 为了方便大家使用springboot已经进行了相关的整合, 仅引入以下starter的方式就完成了整合真的是居家旅行必备良药(ps.有没有跟小Y一起走错片场的呢) 
-->
<!-- SpringBoot quartz依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency><!-- 其他(不引入上面starter的方式时引用) -->
<!-- Quartz核心依赖 -->
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version><scope>compile</scope>
</dependency>

🙂项目配置

接下来我们要做的就是在我们的项目中配置Quartz相关的配置类。

✔️ 首先:

我们知道quartz的几个核心概念中主要控制调度任务是由Scheduler调度器进行操作的,所以我们首先需要向Spring容器注入一个Scheduler调度器。

@Configuration
public class QuartzConfig {/*** 注册调度器创建工厂* @return 调度器工厂* @throws IOException ioe*/@Beanpublic SchedulerFactoryBean schedulerFactoryBean() throws IOException {PropertiesFactoryBean props = new PropertiesFactoryBean();props.setLocation(new ClassPathResource("/config/quartz.properties"));props.afterPropertiesSet();// 创建调度器工厂SchedulerFactoryBean factory = new SchedulerFactoryBean();factory.setQuartzProperties(Objects.requireNonNull(props.getObject()));return factory;}/*** 注册调度器* @return 调度器* @throws IOException ioe*/@Beanpublic Scheduler scheduler() throws IOException {return schedulerFactoryBean().getScheduler();}
}

以上配置仅为最简单的调度器注册方式,后续会根据相关api完善更多高级特性

✔️其次:

现在我们已经将Scheduler调度器注入到容器中,那我们现在需要做些什么?根据前言说到的“调度器”需要“JobDetail”和“Trigger”两样必须品才能开始进行任务调度。那么我们现在就需要将这两个必要参数交给Scheduler。

创建一个存放生成任务的实体

@Data
public class QuartzJob implements Serializable {private static final long serialVersionUID = 6481700930972512111L;/*** 任务名称*/private String jobName;/*** cron表达式*/private String cron;/*** bean全路径*/private String beanClass;/*** 任务分组*/private String jobGroup;/*** 执行参数*/private String jobData;
}

创建生成任务的工具类

@Component
public class QuartzJobUtil {@Resourceprivate Scheduler scheduler;/*** 添加任务* @param quartzJob job* @throws Exception e*/public void addJob(QuartzJob quartzJob) throws Exception {CronTrigger trigger = (CronTrigger) scheduler.getTrigger(TriggerKey.triggerKey(quartzJob.getJobName(), quartzJob.getJobGroup()));if (trigger != null) {return;}Class<?> clazz = Class.forName(quartzJob.getBeanClass());String quartzJobData = quartzJob.getJobData();Map dateMap = new HashMap<>();if (StrUtil.isNotBlank(quartzJobData)) {dateMap = (Map) JSON.parse(quartzJobData);}JobDataMap data = new JobDataMap(dateMap);JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) clazz).withIdentity(quartzJob.getJobName(), quartzJob.getJobGroup()).setJobData(data).build();// 表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCron());// 按新的表达式构建一个新的triggertrigger = TriggerBuilder.newTrigger().withIdentity(quartzJob.getJobName(), quartzJob.getJobGroup()).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);}
}

✔️创建HelloWorld任务

正所谓一切皆从hello world开始,所以我们需要创建一个HelloWorldJob来完成测试功能。

@Slf4j
public class HelloWorldJob implements Job {private Logger logger = LoggerFactory.getLogger(HelloWorldJob.class);private AtomicInteger counter = new AtomicInteger(0);@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 在这里我们简单的进行一下日志打印操作, 来证明任务被调度器调用logger.info("helloWorldJob执行第 {} - 次", counter.incrementAndGet());}
}

✔️将Job交给调度器

我们这里通过@PostConstruct注解在项目启动时,将HelloWorldJob交给调度器,让调度器进行管理并调用。

@PostConstruct
public void initializeJob() {// 启动时, 将job们加载至调度器中try {QuartzJob job = new QuartzJob();job.setJobName("helloWorldJob");job.setJobGroup("hello");job.setBeanClass(HelloWorldJob.class.getName());// 每分钟执行一次job.setCron("0 0/1 * * * ?");quartzJobUtil.addJob(job);} catch (Exception e) {log.error("定时任务加载失败....");e.printStackTrace();}
}

💯测试结果

我们Cron表达式设置的从0开始一分钟执行一次,所以当我们项目启动后,每到一分钟调度器就回执行一次我们的HelloWorld任务啦~😀
image.png

🔚End

本次学习结束~ 期待下一次学习分享~

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

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

相关文章

matlab 定义一个有自变量的方程_常微分方程:(第四章) 高阶微分方程

参考《常微分方程》第三版&#xff08;王高雄&#xff09;常微分方程王高雄 第四章 高阶微分方程_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com对于高阶微分方程&#xff0c;线性部分见4、5章&#xff0c;非线性部分见6章。4.1 线性微分方程的一般理论定义&#xff…

HttpClient api-连接池

【README】 本文 refer2 HttpClient Tutorialhttps://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/pdf/httpclient-tutorial.pdf 【2.3】http连接管理器 【2.3.1】可管理的连接与连接管理器 1&#xff09;http连接简述 HTTP 连接是复杂的、有状态的、线程…

使用SpringBoot搭建一个简单的webSocket服务

前言 个人地址&#xff1a;使用SpringBoot搭建一个简单的webSocket服务 什么是WebSocket&#xff1f; WebSocket是一个HTML5新增的协议,它的目的在浏览器和服务器之间建立一个不受限的双向实时通信的通道。比如&#xff0c;服务器可以任意时刻发送消息给浏览器。它是基于TCP&am…

cas 登录之后不跳转_图解JWT如何用于单点登录

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;流云诸葛http://cnblogs.com/lyzg/p/6132801.html推荐阅读(点击即可跳转阅读)1. 淘宝服务端高并发分布式架构演进之路2. IntelliJ IDEA 从入门到上瘾教程&#xff0c;2019…

转:java网络编程-HTTP编程

转自&#xff1a; java网络编程-HTTP编程_Stillsings的博客-CSDN博客HTTP编程Java HTTP编程支持模拟成浏览器的方式去访问网页URL, Uniform Resource Locator&#xff0c;代表一个资源URLConnection获取资源连接器根据URL的openConnection&#xff08;&#xff09;方法获得URL…

Centos7-通过RPM方式安装MySQL5.7

前言 Hallo&#xff0c;我们都知道开发时数据库是不可或缺的&#xff0c;本文就简单记录一下安装MySQL数据库的其中一种方式吧。 系统环境 系统&#xff1a;CentOS Linux 7.5 数据库版本&#xff1a;5.7 安装步骤 1. 从官网获取安装包 官方下载地址&#xff1a;https://ww…

python开发工具下所有软件都打不开_Python 开发工具链全解

可能刚开始学习Python时&#xff0c;有人跟你说可以将源文件所在的文件夹添加到 PYTHONPATH环境变量中&#xff0c;然后可以从其他位置导入此代码。在大多数情况下&#xff0c;这个人常常忘记补充这是一个非常糟糕的主意。有些人在互联网上发现了这一点&#xff0c;其他人却要看…

利用F#库canopy进行UI测试

虽然Selenium是一个流行的UI测试库&#xff0c;但基于它创建的测试却有着脆弱与不可靠等常见的问题。InfoQ与canopy的作者Chris Holt进行了一次访谈&#xff0c;以便更深入地了解canopy这个在Selenium的基础上所创建的F#库。 InfoQ&#xff1a;你能否为我们介绍一下canopy&…

转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

转自&#xff1a; Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 我之前的HTTP开发是…

SpringBoot整合Shiro权限框架

前言 在系统管理中&#xff0c;权限是非常重要的一个环节。目前权限框架中使用比较多的有Shiro、Spring Security。&#x1f383; 本篇简单写一下SpringBoot整合Shiro权限框架小栗子&#x1f330;。 个人博客地址&#xff1a;SpringBoot整合Shiro权限框架 介绍Shiro Apache S…

Java开发必须掌握的8种网站攻防技术

转载自 Java开发必须掌握的8种网站攻防技术 XSS攻击 XSS攻击的全称是跨站脚本攻击(Cross Site Scripting),是WEB应用程序中最常见到的攻击手段之一。跨站脚本攻击指的是攻击者在网页中嵌入恶意脚本程序, 当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端…

转:json与map互转

转自&#xff1a; java中字符串&#xff0c;json&#xff0c;Map互相转换&#xff08;各种转换都有&#xff09;_蜗牛驿站-CSDN博客_java json转map前提&#xff1a;使用jar包为fastjsonimport com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject; 程序如下: …

专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图

创意配图&#xff1a;微信&#xff0c;微信公众号&#xff0c;微信大V 而且最近发现了一个新的图像处理方面的库—Wand&#xff0c;它是 ImageMagick 库的 Python 接口。于是&#xff0c;我就打算用这个库来实现简单的制作一个二维码关注图&#xff0c;主要是完成以下几个工作&…

如何迁移#SNMP到.NET Core平台的一些体会

.NET Core 依然在飞速进化中&#xff0c;所以如果不是非常喜欢折腾的性格&#xff0c;建议各位还是暂时忍耐。 准备阶段 首先&#xff0c;Visual Studio 2015是必要的开发工具。虽然它已经包含了.NET Core的原始测试版&#xff0c;这里还是推荐下载 RC1 安装包&#xff0c; htt…

JAVA实现一个图片上传预览功能

这个小项目主要使用java实现了一个简单的图片上传预览功能&#xff0c;废话不多说&#xff0c;先上实现成果 ^ _ ^&#x1f4af; 预览 登录页 主页 上传页 图片预览 项目架构 后端: SpringBoot shiro mybatis-plus druid hutool 前端: layui viewer 项目结构 ├─src├…

小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难

PLC实质上是工业计算机&#xff0c;是计算机技术与传统继电接触器控制器技术相结合的产物&#xff0c;只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言。一、PLC的结构从硬件结构上看&#xff0c;PLC主要由中央处理单元(CPU)、存…

内部局域网可自行分配的ip地址

【1】有些ip地址很特殊 以 10. 、 172.16. 、172.31. 、192.168. 开头的所有ipv4地址都未分配。 更确切的说&#xff0c;这些地址不会被 ISP&#xff08;Internet服务提供商&#xff09;分配给广域网上的计算机&#xff0c;即无法加入全球Internet网络-广域网&#xff1b; 但…

以吃货的角度理解 IaaS,PaaS,SaaS 是什么

转载自 以吃货的角度理解 IaaS&#xff0c;PaaS&#xff0c;SaaS 是什么随着云计算时代的到来&#xff0c;越来越多的软件&#xff0c;开始采用云服务。越来越多的概念也随之而来。云服务只是一个统称&#xff0c;可以分成三大类。IaaS&#xff1a;基础设施服务&#xff0c;Inf…

.Net使用RabbitMQ详解

序言 这几天呢&#xff0c;公司风波再起&#xff0c;去年一年公司CTO换啦4任&#xff0c;CEO换啦三个&#xff0c;这不刚来个新老大&#xff0c;感觉还不错&#xff0c;却没干过3个月又要走&#xff0c;索性趁老大们走来走去的时候&#xff0c;就给自己空出来&#xff0c;稍稍总…

SpringBoot整合Redis要注意的那些

前言 昨天自己在重新学习SpringBoot整合Redis时&#xff0c;遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig&#xff0c;错误很明显找不到需要的类。下面主要记录一下错误是怎么出线的&#xff0c;并且如何解决。 错…