您现在的位置是:首页 > java技术交流java技术交流
springboot 使用quartz 创建简单定时任务 入门篇
上善若水2021-01-16 17:44:01【java技术交流】 3325人已围观
简介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)
相关文章
随机图文
-
极品幽默的小笑话,让人笑不停
一:好不容易休了一周的假,打算带着女朋友外出游玩,查了攻略,选了几个风景区,等女朋友做决定…晚上我滔滔不绝地跟她讲每个景点什么特点,有什么必去之处,每讲完一个地方,都会传来一句:“那个地方都有什么好吃的! 二:正在午休,突然啪哒一声把我惊醒,看着打碎在地上的景泰蓝花瓶,拿着抹布惊呆了的老婆。我勃然大怒,高声骂道:惊我睡觉,吓我老婆,你这花瓶坏的很,活该破碎…… 三:老婆来电,说:老公,对不起! -
62个哄女孩开心的笑话,只为博她一笑
1.一天,牛给驴出了一个难题,问“蠢”字下面两只虫子哪只是公的,哪只是母的。驴绞尽脑汁,还是答不上来。牛骂道:真是头蠢驴,男左女右嘛!2.毕业后七年,总算接了个大工程,造一根三十米烟囱,工期两个月,造价三十万,不过要垫资。总算在去年年底搞完了。今天人家去验收,被人骂得要死,还没有钱拿。妈的!图纸看反了,人家是要挖一口井!3.一醉汉不慎从三楼掉下,引来路人围观,一警察过来:发生什么事?醉汉 -
开心一刻:笑死人不偿命的极品笑话
1、今天打雷,雷声有点点大,老公上班不在家。正想着是不是发条短信去装下可怜,结果老公电话来了,正高兴原来那货这么关心我,结果他说:把家里电插头拔了。我问他还有别的事没?他说没了。我说你咋不关心我啊,打雷呐!!!他哦了声说:那你小心点,别被雷劈了…被雷劈!!!我恨 2、今天去剪了个头发,后来理发师没要钱。 3、有个死党叫刘查向,,今天才知道她妈姓向,当我听到他妈姓向时,我笑喷了,呵呵,,他爸挺幽 -
php技术提升心得与方法
现在的PHP市场虽然充斥了大量的的PHP开发人员,但这些人当中真正能称得上高手的却寥寥无几。很多公司虽然招聘了一些PHP开发人员,但是由于技术水平不高,导致公司的项目一直堆积。这不仅另公司无奈也让已经入职的PHP开发人员着急,他们也想要在PHP领域更近一步,但却苦于找不到提高自己的方法,下面我们的鸥仔收集了一些PHP大神的一些工作方式、习惯,让大家看看PHP大神们是如何工作,也希望这些方法能帮助到那些想要在PHP领域更近一步的人。