您现在的位置是:首页 > java技术交流java技术交流
springboot 使用quartz 创建简单定时任务 入门篇
上善若水2021-01-16 17:44:01【java技术交流】 2722人已围观
简介quartz是一款优秀的任务调度框架,尽管在springboot中已经集成有任务调度,但是绝大多数情况也还是使用了quartz在执行. 创建springboot项目 同时引入quartz包pom.xm
quartz是一款优秀的任务调度框架,尽管在springboot中已经集成有任务调度,但是绝大多数情况也还是使用了quartz在执行.
创建springboot项目 同时引入quartz包
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.my-quartz-demo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>my-quartz-demo</name>
<description>Demo project for Spring Boot my-quartz-demo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.编写一个任务调度类继承Job
执行任务调度
package com.myquartzdemo.demo.execute;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Created by EalenXie on 2019/7/10 15:30.
* <p>
* Job 是 定时任务的具体执行逻辑
* JobDetail 是 定时任务的定义
*/
@Slf4j
@DisallowConcurrentExecution
public class SayHelloJobLogic implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//写你自己的逻辑
log.info("SayHelloJob.execute , hello world ! ");
}
}
3. 创建一个实体,用于保存JobDetail和Trigger的部分参数
package com.myquartzdemo.demo.controller;
import com.myquartzdemo.demo.entity.TaskDefine;
import com.myquartzdemo.demo.execute.SayHelloJobLogic;
import com.myquartzdemo.demo.service.QuartzJobService;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class QuartzDemoController {
@Autowired
private QuartzJobService quartzJobService;
/**
* 暂停 hello world
*/
@GetMapping("/addHelloWorldJob")
@ResponseBody
public String addHelloWorldJob(@RequestParam(required = false,defaultValue = "sayHelloJobLogic")String name, @RequestParam(required = false,defaultValue = "GroupOne")String group) throws SchedulerException {
JobKey jobKey = new JobKey(name,group);
//创建一个定时任务
TaskDefine task = TaskDefine.builder()
.jobKey(jobKey)
.cronExpression("0/2 * * * * ? ") //定时任务 的cron表达式
.jobClass(SayHelloJobLogic.class) //定时任务 的具体执行逻辑
.description("这是一个测试的 任务") //定时任务 的描述
.build();
quartzJobService.scheduleJob(task);
return "start HelloWorld Job success";
}
}
4.创建service 传入用户处理创建任务
package com.myquartzdemo.demo.service;
import com.myquartzdemo.demo.entity.TaskDefine;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;
import java.util.Map;
@Slf4j
@Service
public class QuartzJobService {
//Quartz定时任务核心的功能实现类
private Scheduler scheduler;
public QuartzJobService(@Autowired SchedulerFactoryBean schedulerFactoryBean) {
scheduler = schedulerFactoryBean.getScheduler();
}
/**
* 创建和启动 定时任务
* {@link org.quartz.Scheduler#scheduleJob(JobDetail, Trigger)}
*
* @param define 定时任务
*/
public void scheduleJob(TaskDefine define) throws SchedulerException {
//1.定时任务 的 名字和组名
JobKey jobKey = define.getJobKey();
//2.定时任务 的 元数据
JobDataMap jobDataMap = getJobDataMap(define.getJobDataMap());
//3.定时任务 的 描述
String description = define.getDescription();
//4.定时任务 的 逻辑实现类
Class<? extends Job> jobClass = define.getJobClass();
//5.定时任务 的 cron表达式
String cron = define.getCronExpression();
JobDetail jobDetail = getJobDetail(jobKey, description, jobDataMap, jobClass);
Trigger trigger = getTrigger(jobKey, description, jobDataMap, cron);
scheduler.scheduleJob(jobDetail, trigger);
}
public JobDataMap getJobDataMap(Map<?, ?> map) {
return map == null ? new JobDataMap() : new JobDataMap(map);
}
/**
* 获取定时任务的定义
* JobDetail是任务的定义,Job是任务的执行逻辑
*
* @param jobKey 定时任务的名称 组名
* @param description 定时任务的 描述
* @param jobDataMap 定时任务的 元数据
* @param jobClass {@link org.quartz.Job} 定时任务的 真正执行逻辑定义类
*/
public JobDetail getJobDetail(JobKey jobKey, String description, JobDataMap jobDataMap, Class<? extends Job> jobClass) {
return JobBuilder.newJob(jobClass)
.withIdentity(jobKey)
.withDescription(description)
.setJobData(jobDataMap)
.usingJobData(jobDataMap)
.requestRecovery()
.storeDurably()
.build();
}
/**
* 获取Trigger (Job的触发器,执行规则)
*
* @param jobKey 定时任务的名称 组名
* @param description 定时任务的 描述
* @param jobDataMap 定时任务的 元数据
* @param cronExpression 定时任务的 执行cron表达式
*/
public Trigger getTrigger(JobKey jobKey, String description, JobDataMap jobDataMap, String cronExpression) {
return TriggerBuilder.newTrigger()
.withIdentity(jobKey.getName(), jobKey.getGroup())
.withDescription(description)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.usingJobData(jobDataMap)
.build();
}
}
5.创建控制器 添加接口用于创建定时任务
package com.myquartzdemo.demo.controller;
import com.myquartzdemo.demo.entity.TaskDefine;
import com.myquartzdemo.demo.execute.SayHelloJobLogic;
import com.myquartzdemo.demo.service.QuartzJobService;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class QuartzDemoController {
@Autowired
private QuartzJobService quartzJobService;
/**
* 暂停 hello world
*/
@GetMapping("/addHelloWorldJob")
@ResponseBody
public String addHelloWorldJob(@RequestParam(required = false,defaultValue = "sayHelloJobLogic")String name, @RequestParam(required = false,defaultValue = "GroupOne")String group) throws SchedulerException {
JobKey jobKey = new JobKey(name,group);
//创建一个定时任务
TaskDefine task = TaskDefine.builder()
.jobKey(jobKey)
.cronExpression("0/2 * * * * ? ") //定时任务 的cron表达式
.jobClass(SayHelloJobLogic.class) //定时任务 的具体执行逻辑
.description("这是一个测试的 任务") //定时任务 的描述
.build();
quartzJobService.scheduleJob(task);
return "start HelloWorld Job success";
}
}
6添加一个静态html到 static目录
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>quartz</title>
</head>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<body>
<a href="/addHelloWorldJob"><button>添加SayHello任务</button></a>
</body>
<script>
</script>
</html>
7.运行项目
访问 http://127.0.0.1:8080 点击按钮.即可完成任务创建!
本文产考
https://github.com/EalenXie/springboot-quartz-simple
感谢大佬的无私分享!
Tags: quartz
很赞哦! (5)
相关文章
随机图文
-
java Map删除值为null的元素 lamada表达式一行代码就搞定
由于map在使用foreach循环中删除元素的话会报空指针异常,只能采用迭代器的方式删除元素,写好代码后编译器竟然意外的提示我将代码改成lamada表达式,瞬间代码精简,idea牛逼!map.entr -
10个笑死人不偿命的笑话,发给你,足以让你笑着过周末了!
1.妻子想让老公早回家,于是规定:晚于23点回家就锁门。第一周奏效,第二周老公又晚归,老婆按制度把门锁了,于是老公干脆不回家了。 老婆郁闷,后经高人指点,修改规定:23点前不回家,我就开着门睡觉。老公大惊,从此准时回家。 可见制度的精髓不在于强制,而在于对被执行者利益的拉动。 2.小鸡问母鸡:可否不用下蛋,带我出去玩啊?母鸡道:不行,我要工作! 是因为你创造价值,淘汰是因为你失去价值。过去 -
历年出生人口(1949-2021)
先看一组人口出生数据:2019年:1465万2020:1200万2021年:1062万 1949年:1275万 1950年:1419万 1951年:1349万 1952年:1622万 1953年:1637万 1954年:2232万 -
笑话6则:其实哄女孩子开心很简单
1、进药店想买TT,店里人太多不好意思,就对营业员说:“我买那个...”营业员说:“你买什么?”我支唔着:“就是那个...”营业员问:“那个什么?”我生气道:“TT啊,你怎么连这暗示都不懂?”营业员连声道歉:“对不起对不起,我没想到你有女朋友。”2、有人问我:“你诚实说,一年你能挣多少钱?”我说:“四五十万吧。”他听后说:“你诚实了吗?”我说:“嗯,我乘1