您现在的位置是:首页 > java技术交流java技术交流
springboot 使用quartz 创建简单定时任务 入门篇
上善若水2021-01-16 17:44:01【java技术交流】 3289人已围观
简介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)
相关文章
随机图文
-
php 自己打包一个composer包
今天尝试自己自己封装一个包,以后就可以直接composer安装方便复用,一开始看到别人有将官方提供 的包给做成composer包,方便使用,记录下自己的过成. 首先准备一个已经初始话过的仓库地址 并 -
逗女朋友开心的笑话,皮到爆炸,没有之一
一、每个宿舍都有一个磨牙的、一个打呼噜的、一个说梦话的,还有一个睡得最迟,却纵观全场的。二、我上辈子八成是狗,要不然不会:穷成狗、丑成狗、忙成狗、累成狗、肥成狗、矮成狗、哭成狗、冻成狗。三、媳妇:如果有一天我和范冰冰掉进河里你先救谁?老公:当然是先救你,她和我有半毛钱关系!媳妇:如果她说如果你先救他,她就嫁给你呢?老公:那也不行,万一她骗我呢。媳妇:真特码保本!四、看了网上有很多说熬夜 -
PHP8.2新特性 只读类 支持用readonly作为标识符修饰类
PHP8.2新特性 只读类 支持用readonly作为标识符修饰类自 PHP 8.2.0 起,可以使用 readonly 修饰符来标记类。将类标记为 readonly 只会向每个声明的属性添加 rea -
冠状病毒科普 什么是冠状病毒
冠状病毒在分类层级上是科,冠状病毒科拉丁文名Coronaviridae, 简称CoV,因为外形呈球状,具有花瓣状的刺突,因此根据其形状,国际病毒命名委员会在1975年正式命名为“冠状病毒科”。目前已知