【Quartz】任务调度

news2024/12/24 16:33:58

文章目录

  • 概述
  • 调度任务方案
    • 核心概念
    • 快入入门
    • 持久化操作
  • 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.coloradmin.cn/o/2264817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04安装imwheel实现鼠标滚轮调速

ubuntu20.04安装imwheel实现鼠标滚轮调速 Ubuntu 系统自带的设置中仅具备调节鼠标速度的功能&#xff0c;而无调节鼠标滚轮速度的功能。其默认的鼠标滚轮速度较为缓慢&#xff0c;在查看文档时影响尚可接受&#xff0c;但在快速浏览网页时&#xff0c;滚轮速度过慢会给用户带来…

GitLab的安装与卸载

目录 GitLab安装 GitLab使用 使用前可选操作 修改web端口 修改Prometheus端口 使用方法 GitLab的卸载 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab安装 Gitlab的rpm包集成了它需要的软件&#xff0c;简化了安装步骤&#xff0c;所以直接…

简单工厂模式和策略模式的异同

文章目录 简单工厂模式和策略模式的异同相同点&#xff1a;不同点&#xff1a;目的&#xff1a;结构&#xff1a; C 代码示例简单工厂模式示例&#xff08;以创建图形对象为例&#xff09;策略模式示例&#xff08;以计算价格折扣策略为例&#xff09;UML区别 简单工厂模式和策…

脑肿瘤检测数据集,对9900张原始图片进行YOLO,COCO,VOC格式的标注

脑肿瘤检测数据集&#xff0c;对9900张原始图片进行YOLO&#xff0c;COCO&#xff0c;VOC格式的标注 数据集分割 训练组 70&#xff05; 6930图片 有效集 20&#xff05; 1980图片 测试集 10&#xff05; 990图片 预处理 静态裁剪&#xff1a; 24-82&…

YOLOv8 | 训练自定义数据集

目录 1 处理数据集1.1 数据集格式介绍1.2 划分数据集1.3 在 YOLOv8 中配置数据集 2 训练 YOLOv8 模型2.1 模型训练代码2.2 开启 TensorBoard 若尚未部署 YOLOv8&#xff0c;则可参考这篇博客&#xff1a; YOLOv8 | Windows 系统下从零开始搭建 YOLOv8 项目环境 1 处理…

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…

可编辑99PPT | 智能工厂整体规划方案及实施细部方案

荐言分享&#xff1a;智能工厂是利用物联网、大数据、人工智能等先进技术&#xff0c;实现生产过程自动化、智能化和柔性化的现代工厂。本整体规划方案旨在通过整合信息技术、自动化技术、人工智能技术和物联网技术&#xff0c;构建一个高效、灵活、绿色、可持续的生产环境&…

Allegro17.4创建异形焊盘速通

Allegro17.4创建异形焊盘速通 打开Padstack Editor 17.4&#xff0c;新建焊盘&#xff0c;以标贴焊盘为例: 该标贴焊盘是在底面&#xff0c;选择END LAYRE &#xff0c;选择 Shape symbol Geometry&#xff0c;Shape symbol选择框右边有选择键&#xff0c;跳到Library Shape S…

多行为级联24|多行为推荐的超图增强级联图卷积网络

挂到arxiv上的&#xff0c;多行为级联超图加对比学习,超图是针对单个行为的&#xff0c;而不是针对多个行为的。参考的类似工作是CRGCN加MBSSL。这两篇我都做了论文阅读&#xff0c;&#xff08;CRGCN正在路上&#xff0c;MBSSL是我的第一篇论文阅读帖子&#xff09;推荐系统论…

利用.NET Upgrade Assitant对项目进行升级

本教程演示如何把WPF程序从 <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>升级到<TargetFramework>net8.0-windows</TargetFramework>. 下载并安装.NET Upgrade Assistant - Visual Studio Marketplace Supported .NET upgrades: .NET Frame…

Vue2四、 scoped样式冲突,data是一个函数,组件通信-父传子-子传父-非父子

组件通信 1. 父组件通过 props 将数据传递给子组件 2. 子组件利用 $emit 通知父组件修改更新 父--->子 子--->父

第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ

Q1、统计符合条件长度为3的子数组数目 1、题目描述 给你一个整数数组 nums &#xff0c;请你返回长度为 3 的子数组&#xff0c;满足第一个数和第三个数的和恰好为第二个数的一半。 子数组 指的是一个数组中连续 非空 的元素序列。 2、解题思路 我们需要在给定的数组 nums…

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

铝电解电容使用寿命

铝电解电容寿命问题 铝电解电容为什么会失效&#xff1f;铝电解电容失效与那些因素有关&#xff1f;电解电容寿命如何计算&#xff1f; 1铝电解电容为什么会失效&#xff1f; 电容都是由两个导电板并排放到一起就构成了。正极是铝&#xff08;阳极箔&#xff09;&#xff0c;…

用Python PySide6 复刻了两软件UI 做下练习

图样 1 代码 1&#xff1a; # -*- coding: utf-8 -*-import sys from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, QDate) from PySide6.QtGui import QIcon, QPixmap, QColor from PySide6.QtWidgets import (QApplication, QDialog, QLineEdit, QPushBut…

安装MongoDB,环境配置

官网下载地址&#xff1a;MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成&#xff1a;分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

重温设计模式--职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&a…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为&#xff0c;深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题&#xff0c;并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导&#xff0c;助力考生科学合理地填报高考志愿&#xff0c;避免陷入各…