当前位置: 首页 > article >正文

【Quartz】任务调度

文章目录

  • 概述
  • 调度任务方案
    • 核心概念
    • 快入入门
    • 持久化操作
  • RestTemplate
    • 介绍
    • 创建RestTemplate Bean
    • 常用方法

概述

一个任务调度开源框架,可以执行上百,上万个个任务,对集群是支持的

就是基于java实现的任务调度框架

调度任务方案

  1. Timer:
  2. Thread:
  3. Task:SpringBoot提供的一套方案
  4. 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;
    }
  
 }

常用方法

  1. getForObject(url, responseType, uriVariables):用于发起GET请求,并返回指定类型的响应对象
  2. 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);
    }
}

http://www.kler.cn/a/449545.html

相关文章:

  • 重温设计模式--单例模式
  • Windows 11 安装 Dify 完整指南 非docker环境
  • webrtc音频模块(三) windows Core Audio API及声音的播放
  • 四种自动化测试模型实例及优缺点详解
  • 【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
  • Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
  • Qt C++ 下网络通信与文件发送的实现
  • 黑马商城项目—服务注册、服务发现
  • C++ STL CookBook
  • 拥有人类情感的AI:未来还是幻想?
  • 蓝桥杯刷题——day9
  • AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
  • K8S中的PV、PVC介绍和使用
  • 探秘 DNS 服务器:揭开域名解析的神秘面纱
  • 【已解决】【大数据综合案例】上| Hive与MongoDB配置
  • 【CSS in Depth 2 精译_086】14.3:CSS 剪切路径(clip-path)的用法
  • 探索人工智能及机器学习如何赋能IP代理
  • HTML5 Web IndexedDB 数据库
  • 【chkdsk】chkdsk 按下停止键的后果
  • WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)
  • 直流电机驱动电路分享(HIP4082)
  • 《开启微服务之旅:Spring Boot Web开发举例》(二)
  • C++ 中的字面量类型定义
  • Redis数据对象
  • 谷歌发布首个 AI 推理模型欲挑战 OpenAI o1,AI 领域将展开新的竞争
  • 砂轮磨料基础知识及发展学习笔记