Spring Boot 中实现定时任务的常用方式--Quartz
一、Quartz的介绍以及Quartz的使用思路
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。
- job - 任务 - 你要做什么事?
- Trigger - 触发器 - 你什么时候去做?
- Scheduler - 任务调度 - 你什么时候需要去做什么事?
二、Quartz的简单使用
1.导入依赖
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency>
2.创建任务类
package com.fync.quartz;import java.text.SimpleDateFormat;
import java.util.Date;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/*** 创建要被定执行的任务类**/
public class MyJob implements Job{public void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");System.out.println(sdf.format(new Date()));}}
3.创建任务调度及执行
package com.fync.quartz;import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;/*** 创建任务调度,并执行*/
public class MainScheduler {//创建调度器public static Scheduler getScheduler() throws SchedulerException{SchedulerFactory schedulerFactory = new StdSchedulerFactory();return schedulerFactory.getScheduler();}public static void schedulerJob() throws SchedulerException{//创建任务JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();//创建触发器 每3秒钟执行一次Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group3").withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever()).build();Scheduler scheduler = getScheduler();//将任务及其触发器放入调度器scheduler.scheduleJob(jobDetail, trigger);//调度器开始调度任务scheduler.start();}public static void main(String[] args) throws SchedulerException {MainScheduler mainScheduler = new MainScheduler();mainScheduler.schedulerJob();}}
三、整合springBoot
1、导入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--定时器依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.1.5.RELEASE</version></dependency></dependencies>
2.配置类
package com.config;
import com.JobScheduled.QuartzDemo;
import org.quartz.SimpleTrigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;/*** Quartz配置类*/
@Configuration
public class QuartzConfig {// 1.创建Job对象@Beanpublic JobDetailFactoryBean jobDetailFactoryBean() {JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
// 关联自己的类factoryBean.setJobClass(QuartzDemo.class);return factoryBean;}// 2.创建Trigger对象(简易版)@Beanpublic SimpleTriggerFactoryBean simpleTriggerFactoryBean( JobDetailFactoryBean jobDetailFactoryBean) {SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
// 关联jobDetail对象factoryBean.setJobDetail(jobDetailFactoryBean.getObject());
// 该参数表示一个执行的毫秒数factoryBean.setRepeatInterval(2000);
// 设置重复次数factoryBean.setRepeatCount(5);return factoryBean;}// 3.创建Scheduler对象@Beanpublic SchedulerFactoryBean schedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean){SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();factoryBean.setTriggers(simpleTriggerFactoryBean.getObject());return factoryBean;}
}
3.定时任务类
package com.JobScheduled;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;/*** Job类*/
public class QuartzDemo implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("Quartz定时任务");}
}
4、开启定时任务
@SpringBootApplication
//开启定时任务
@EnableScheduling
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
四:多任务
/*** 第一个任务*/// 1.创建Job对象@Bean(name = "oneJobDetail")public MethodInvokingJobDetailFactoryBean OneJobDetail(OneJob oneJob) {MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();// 是否并发执行jobDetail.setConcurrent(true);// 为需要执行的实体类对应的对象jobDetail.setTargetObject(oneJob);// 需要执行的方法jobDetail.setTargetMethod("task");return jobDetail;}// 2.创建Trigger对象(简易版)@Bean(name = "oneTrigger")public SimpleTriggerFactoryBean OneSimpleTrigger(JobDetail oneJobDetail) {SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();// 设置任务启动延迟trigger.setStartDelay(0);
// 关联jobDetail对象trigger.setJobDetail(oneJobDetail);
// 该参数表示一个执行的毫秒数trigger.setRepeatInterval(2000);
// 设置重复次数(-1=无限次)trigger.setRepeatCount(2);return trigger;}/*** 第二个任务*/@Bean(name = "twoJobDetail")public MethodInvokingJobDetailFactoryBean twoJobDetail(TwoJob twoJob) {MethodInvokingJobDetailFactoryBean jobdetail = new MethodInvokingJobDetailFactoryBean();jobdetail.setConcurrent(true);jobdetail.setTargetObject(twoJob);jobdetail.setTargetMethod("task");return jobdetail;}// 2.创建Trigger对象(简易版)@Bean(name = "twoTrigger")public SimpleTriggerFactoryBean twoSimpleTrigger(JobDetail twoJobDetail) {SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();trigger.setJobDetail(twoJobDetail);trigger.setRepeatInterval(2000);trigger.setRepeatCount(3);return trigger;}// 3.创建Scheduler对象@Beanpublic SchedulerFactoryBean schedulerFactoryBean(Trigger oneTrigger, Trigger twoTrigger) {SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();factoryBean.setTriggers(oneTrigger, twoTrigger);return factoryBean;}
任务类@Component装配上即可
- 第一种实现:
- 1.任务类继承job 实现execute方法
- 2.将任务类扔进 JobDetailFactoryBean(不够灵活)
- 第二种实现:
- 1.任务类 @Component 装配
- 2.将任务类扔进 MethodInvokingJobDetailFactoryBean
- 相比第一种更方便,定位更准确,针对方法体,易于多任务并发执行
总结:一般复杂的任务定时调度,才会考虑Quartz,去做数据持久化,以上只是简单的实现Quartz,
定时任务简单的情况下,建议使用spring3.0自带的定时:@Scheduled
参考:Spring Boot 中实现定时任务的常用方式@Scheduled
SpringBoot 整合 Quartz 实现 JAVA 定时任务的动态配置
Spring Boot 中实现定时任务的常用方式--Quartz相关推荐
- Spring Boot:在Spring Boot中使用定时任务
2019独角兽企业重金招聘Python工程师标准>>> 本文主要介绍如何在Spring Boot中使用定时任务,假设你已经建好了一个基础的Spring Boot项目.首先,我们在项目 ...
- 【Spring Security】解答Spring Boot 中密码加密的正确方式?
Spring Boot 项目中密码如何加密 先说一句:密码是采用非对称加密是无法解密的.密码无法解密,还是为了确保系统安全.今天就来和大家聊一聊,密码要如何处理,才能在最大程度上确保我们的系统安全.密 ...
- Spring Boot中使用@Scheduled创建定时任务
我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时 ...
- springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式
假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...
- SpringBoot - Spring Boot 中的配置体系Profile全面解读
文章目录 Pre Spring Boot 中的配置体系 配置文件与 Profile 主 application.properties 中指定激活的Profile Profile 配置信息只保存在一个文 ...
- Spring Boot中的一些常用配置介绍!
这篇教程将为你介绍Spring Boot 中的一些常用配置,比如:自定义 Banner.配置日志.关闭特定的自动配置等. 自定义Banner 在 Spring Boot 启动的时候会有一个默认的启动图 ...
- 在Spring Boot中使用@Scheduled实现定时任务
2019独角兽企业重金招聘Python工程师标准>>> 在Spring Boot中使用@Scheduled实现定时任务 之前没有使用Spring Boot的Java风格配置的时候,用 ...
- java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题
SSM中 Spring MVC配置 传统的web.xml配置 web.xml contextConfigLocation classpath*:applicationContext.xml org.s ...
- RabbitMQ(六)——Spring boot中消费消息的两种方式
前言 上一篇博客中,我们只是简单总结了Spring boot中整合RabbitMQ的操作,针对消息消费的两种方式只是简单给了一个实例,这篇博客,我们进一步总结关于Spring boot消息消费的相关功 ...
- Spring Boot 中的热部署方式总结
1 Spring Boot 的热部署方式 1.模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在appl ...
最新文章
- python有没有中文版-python有中文版吗
- lastpass密码管理工具使用教程
- Google图解:Chrome 快是有原因的,科普浏览器架构!
- sql创建计算机用户,2015年计算机四级数据库复习要点:SQL Server 登录账户
- 通过Yeoman快速搭建AngularJS webapp应用的实践
- setwindowpos怎么改变z序_【情感问答】||朋友圈子小,沉默寡言嘴不甜,情商低,该怎么脱单?...
- Spring的IOC理解(转载)
- Testbench编写方法
- SVN客户端的安装与使用----第一章
- python爬取别人qq空间相册_Python网络爬虫5 - 爬取QQ空间相册
- Python爬虫自己写项目之:爬取火车站的时刻表和票务信息
- 手把手教你学五笔打字输入法之1(如何快速巧记五笔字型字根表篇)
- 旧文重发:从第三方服务角度看各公司技术部门如何正确计算投入产出比~
- linux 重启apache:apachectl -k graceful
- stm32f407Zgt6 与 hc05蓝牙模块通信
- 【12月原创】RT-thread - 柿饼UI —— 网络流媒体播放器
- 在线AES加密/解密工具
- JAVA 根据模板生成doc文件
- 计算机插补,第三章计算机数控装置的插补原理.doc
- 基于 QT 开发的联机五子棋
热门文章
- mysql 主从复制延迟_什么情况会导致MySQL主从复制延迟?
- 引入外部less_CSS扩展语言sass和less应该选哪个?
- C/C++[codeup 1929,]今天星期几
- 算法:Invert Binary Tree(翻转二叉树)
- 基于PCA降维实现人脸识别
- axios token失效刷新token怎么重新请求_Token 刷新并发处理解决方案
- php5中使用xslt扩展,.NET_解析在.net中使用XSLT转换xml文档的示例详解,XSL即可扩展的样式表文件。 可 - phpStudy...
- java编程给三个数字排序_JAVA程序.输入3个数字,有IF语句,从小到大排序
- 【从线性回归到BP神经网络】第二部分:线性回归
- Boost组件lexical_cast