【Quartz】任务调度
文章目录
- 概述
- 调度任务方案
- 核心概念
- 快入入门
- 持久化操作
- RestTemplate
- 介绍
- 创建RestTemplate Bean
- 常用方法
概述
一个任务调度开源框架,可以执行上百,上万个个任务,对集群是支持的
就是基于java实现的任务调度框架
调度任务方案
- Timer:
- Thread:
- Task:SpringBoot提供的一套方案
- quartz:
Task用法
@Component
public class TestJob {
//从0秒开始 没间隔2秒执行一次
秒 分 时 日 月 星期
@Scheduled(cron = "0/2 * * * * ?")
public void test1(){
System.out.println(new Date());
}
}
//启动类添加@EnableScheduling
https://cron.qqe2.com/
核心概念
任务Job M
Job就是你想要实现的任务类,每一个Job必须实现Job接口,只需要实现execute方法
**触发器Trigger. V
Trigger为你执行任务的触发器,比如你每天想3点发送一份统计邮件,Trigger将会设置3点进行进行执行该任务。
调度器Scheduler C
Scheduler为任务调度器,它会将任务Job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job
快入入门
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
com.codingfuture.glacier.quartz.quartzService
@Component
public class QuartzService {
//任务调度器
@Autowired
private Scheduler scheduler;
public void test1(String cron) throws SchedulerException {
JobDetail job = JobBuilder.newJob().withIdentity("test")
.ofType(QuartzJob.class).build();
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("test")
.withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?")).build();
scheduler.scheduleJob(job, trigger);
}
public void testShutDown( ) {
try {
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
com.codingfuture.glacier.quartz.QuartzJob
//创建任务类。实现Job接口
@Component
public class QuartzJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println(context.getJobDetail().getKey() + "test" + new Date());
}
}
com.codingfuture.glacier.controller.CompanyController
@RestController
public class CompanyController {
//注入quartzService
@Autowired
private QuartzService quartzService;
@GetMapping("/test")
public Result<Void> test(String cron) throws SchedulerException {
quartzService.test1(cron);
return Result.ok();
}
}
停止任务
// 1. 停止任务
TriggerKey triggerKey = TriggerKey.triggerKey(sn);
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(JobKey.jobKey(sn));
运行启动类
持久化操作
持久化操作是基于数据库表实现的
持久化可以将Quartz任务的状态保存到数据库中,从而避免每次重新启动Quartz服务时重新执行未完成的任务,提高系统的可靠性和稳定性。同时,持久化还可以将任务的历史记录保存下来,方便后续的监控和分析。此外,对于一些长时间运行的任务,持久化还可以节省系统资源,提高系统的性能。因此,使用Quartz进行持久化可以提高系统的可靠性、稳定性和性能。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/glacier
username: root
password: root1234
quartz:
#相关属性配置
properties:
org:
quartz:
scheduler:
# 注意在一个服务下 这个名字要唯一
instanceName: SchedulerCluster
instanceId: AUTO
jobStore:
# class: org.quartz.impl.jdbcjobstore.JobStoreTX
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
# 开启分布式部署
isClustered: true
# 分布式节点有效性检查时间间隔,单位:毫秒
clusterCheckinInterval: 1000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5
# 配置是否启动自动加载数据库内的定时任务,默认true
threadsInheritContextClassLoaderOfInitializingThread: false
#数据库方式
job-store-type: jdbc
注意:
这是由于SpringBoot在2.5.6版本之后就删除了关于Quartz相关的依赖。
所以在2.5.6版及之前用class: org.quartz.impl.jdbcjobstore.JobStoreTX
所以在2.5.6版及之后用class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
DELETE FROM QRTZ_BLOB_TRIGGERS;
DELETE FROM QRTZ_CALENDARS;
DELETE FROM QRTZ_CRON_TRIGGERS;
DELETE FROM QRTZ_FIRED_TRIGGERS;
DELETE FROM QRTZ_LOCKS;
DELETE FROM QRTZ_PAUSED_TRIGGER_GRPS;
DELETE FROM QRTZ_SCHEDULER_STATE;
DELETE FROM QRTZ_SIMPLE_TRIGGERS;
DELETE FROM QRTZ_SIMPROP_TRIGGERS;
DELETE FROM QRTZ_TRIGGERS;
DELETE FROM QRTZ_JOB_DETAILS;
RestTemplate
介绍
RestTemplate是Spring框架中用来访问Rest服务的一个模块,可以通过简单的方法调用,实现http的各种请求,包括 GET, POST, PUT , DELETE 等。底层采用HttpClient
创建RestTemplate Bean
我们需要在Spring容器中创建RestTemplate Bean
@Configuration
public class VirtualMachineConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
//如果RestTemplate请求不支持content type [text/html;charset=UTF-8]类型请做如下配置
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new
MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(
MediaType.TEXT_HTML,
MediaType.TEXT_PLAIN));
restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
return restTemplate;
}
}
常用方法
- getForObject(url, responseType, uriVariables):用于发起GET请求,并返回指定类型的响应对象
- postForObject(url, request, responseType, uriVariables):用于发起POST请求,并返回指定类型的响应对象
@SpringBootTest
class TmsBaseApplicationTests {
@Autowired
private RestTemplate restTemplate;
@Test
void find() {
String url = "http://localhost:8080/xxxx/findById?id=1";
ResponseEntity<Result> forEntity = restTemplate.getForEntity(url, Result.class);
System.out.println(forEntity.getBody().getData());
}
@Test
void add() {
TmsSysUserParamDTO tmsSysUserParamDTO = new TmsSysUserParamDTO();
tmsSysUserParamDTO.setId(null);
tmsSysUserParamDTO.setName("码上未来");
String url = "http://localhost:8080/xxxx/add";
restTemplate.postForEntity(url, tmsSysUserParamDTO, Result.class);
}
}