三种定时器的实现方式

一、@Scheduled

@Schedule是Spring框架提供的一种简单的定时任务调度方法,通过注解的方式即可实现定时任务的调度。它适用于简单的定时任务需求,例如每隔一段时间执行一次任务或者在特定时间执行任务。@Scheduled可以轻松地集成到Spring应用中,但在处理复杂地调度需求时可能显得不够灵活。

使用实例

  1. 在定时任务上添加注解

    @Service
    public class TimerServiceImpl implements ITimerService {
        @Override
        @Scheduled(cron = "0/5 * * * * ?")
        public void testScheduled() {
            //每5秒执行一次
            System.out.println("我执行了一次testScheduled()");
        }
    }
    
  2. 在启动类上通过 @EnableScheduling 注解开启spring的任务调度功能。

    @SpringBootApplication
    @EnableScheduling
    public class JobApp {
        public static void main(String[] args) {
            SpringApplication.run(JobApp.class);
        }
    }
    

二、Quartz

Quartz是一个功能强大的、开源的定时任务调度框架,提供了丰富的功能和灵活的调度管理。它支持复杂的调度需求,作业持久化、集群部署等功能。Quartz可以与Spring等框架无缝集成,被广泛应用于企业级应用中,使用与单体服务,不适合分布式。

接下来简单介绍一下如何使用

2.1 引入依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2.2 创建一个定时器任务

实现 QuartzJobBean 的方法。

public class MyJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("我是定时器quartz,准备运行...");
    }
}

2.3 构建定时器任务触发器

创建一个配置类

@Configuration
public class JobConfig {
    @Bean
    public JobDetail jobDetail(){
        return JobBuilder.newJob(MyJob.class)
                .storeDurably(true)
                .build();
    }
    @Bean
    public Trigger trigger(){ //用于创建一个和先前创建的定时器任务关联起来的触发器,设置触发器时间为每隔5秒
       return  TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
    }
}

三、xxl-job

XXL-Job是一个分布式任务调度平台,提供了可视化的任务管理界面、任务的动态添加、修改、删除等功能。它支持分布式部署,并提供了任务执行日志、任务运行状态等监控功能。XXL-Job是为了解决分布式系统中任务调度的问题而设计的,适合于大规模分布式系统中的定时任务调度。

官网:https://www.xuxueli.com/xxl-job/
接下来简单介绍一下如何使用

3.1 安装

  1. 为了方便,使用 docker-compose 安装

    version: '2'
    #自定义的docker网络
    networks:
      docker_net:
        external: true
    services:
      xxl-job-compose:
        #读取Dockerfile
        #build: 
        #  context: .
        #  dockerfile: Dockerfile文件名
        #镜像名称
        image: xuxueli/xxl-job-admin:2.3.1
        #容器名称
        container_name: xxl-job
        ports:
          - "9898:8080"
        environment:
          PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.201.81:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
                   --spring.datasource.username=root
                   --spring.datasource.password=123'
        volumes:
          - /usr/local/software/xxl-job/logs:/data/applogs
        networks:
          docker_net:
            ipv4_address: 172.18.12.100
    
  2. 加载数据库信息
    官方提供了数据库文件,我们只需要下载下来运行即可。
    在这里插入图片描述

  3. 运行
    使用 docker-compose up -d 执行 docker-compose.yml 文件。
    启动成功后,浏览器输入http://虚拟机ip:9898/xxl-job-admin,出现下面的界面即表示运行成功。
    在这里插入图片描述
    使用用户名 admin ,密码 123456 登录。
    在这里插入图片描述

3.2 xxl-job编程

  1. 引入依赖

    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.3.1</version>
    </dependency>
    
  2. yml 文件中配置

    #xxljob的配置
    xxl:
      job:
        admin:
          addresses: http://192.168.200.135:9898/xxl-job-admin
        executor:
          appname: xxl-job-executor-sample
          port: 9777
        accessToken: default_token
    

    appname的名称从下面这里获取。 在这里插入图片描述3. java 配置类

    import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    @Slf4j
    @Configuration
    public class XxlJobConfig {
        @Value("${xxl.job.admin.addresses}")
        private String address;
        @Value("${xxl.job.executor.appname}")
        private String appName;
        @Value("${xxl.job.executor.port}")
        private int port;
        @Value("${xxl.job.accessToken}")
        private String accessToken;
        @Bean
        public XxlJobSpringExecutor xxlJobSpringExecutor(){
            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
            xxlJobSpringExecutor.setAccessToken(accessToken);
            xxlJobSpringExecutor.setAdminAddresses(address);
            xxlJobSpringExecutor.setAppname(appName);
            xxlJobSpringExecutor.setPort(port);
            log.debug("xxl-job初始化成功:{}",xxlJobSpringExecutor);
            return xxlJobSpringExecutor;
        }
    }
    
  3. 创建调度任务

    @Component
    @Slf4j
    public class MyJobs {
        @XxlJob("helloXxl")
        public void helloXxlJob(){
            log.debug("hello,xxljob");
        }
    }
    
  4. web 管理端配置
    配置任务:任务管理 -> 新增,根据实际情况填写内容,注意 JobHandler内容需要与创建的调度任务注解名称保持一致。
    在这里插入图片描述

  5. 测试
    点击新建任务右侧的操作,来执行代码。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Huawei FusionSphere FusionCompte FusionManager

什么是FusionSphere FusionSphere 解决方案不独立发布软件&#xff0c;由各配套部件发布&#xff0c;请参 《FusionSphere_V100R005C10U1_版本配套表_01》。 目前我们主要讨论FusionManager和FusionCompute两个组件。 什么是FusionCompte FusionCompute是华为提供的虚拟化软…

什么是中间人攻击

中间人攻击 1. 定义2. 中间人攻击如何工作3. 常见中间人攻击类型4. 如何防止中间人攻击 1. 定义 中间人攻击&#xff08;Man-in-the-Middle Attack&#xff0c;简称MITM&#xff09;&#xff0c;是一种会话劫持攻击。攻击者作为中间人&#xff0c;劫持通信双方会话并操纵通信过…

python程序将部分文件复制到指定目录

geotools-28.2中的lib一共有264个jar包&#xff0c;但我只想将部分100个左右jar包引导我的环境中&#xff0c;那个就需要从目录中找出想要的那100个jar&#xff0c;手动挑选太费时间&#xff0c;我简单的写了个小脚本来实现。 我将想要的jar文件名和路径存放到txt中&#xff0…

如何在 Chrome 上调试文件打断点

1. 控制台进入 Source 2. CtrlP 输入文件名称 3. 在需要的位置手动打断点 4. 重新触发代码运行&#xff0c;触发断点

Python中的类(Class)和对象(Object)

目录 一、引言 二、类&#xff08;Class&#xff09; 1、类的定义 2、类的实例化 三、对象&#xff08;Object&#xff09; 1、对象的属性 2、对象的方法 四、类和对象的继承和多态性 1、继承 2、多态性 五、类与对象的封装性 1、封装的概念 2、Python中的封装实现…

Java参数验证@Validated

就以登录接口为例&#xff0c;如果用户传参的时候没有传递帐号或者密码&#xff0c;会报错&#xff0c;但是报错的信息不够全面&#xff0c;前端人员不好判断是什么问题&#xff0c;这个时候就需要对参数进行一个校验 引入依赖 <dependency><groupId>org.hibernat…

一键式紧急报警柱系统

随着科技的不断发展&#xff0c;一键式紧急报警柱在我们的生活和工作中扮演着越来越重要的角色。在这篇文章中&#xff0c;我们将一起探究与一键式紧急报警柱有关的知识。 一键式紧急报警柱是一种常见的安全防护设备&#xff0c;能够在紧急情况下快速发出警报&#xff0c;保护…

LabVIEW开发工业设备远程在线状态监测

LabVIEW开发工业设备远程在线状态监测 项目需要减少意外停机和维护费用、提供更完整的机器操作和状态图、改进设备使用情况跟踪。 该解决方案是一个多节点&#xff08;即多站点&#xff09;远程监控系统&#xff0c;它利用了基于NI cRIO的控制器和定制的LabVIEW监测软件。 方…

基于YOLOv8深度学习的安全帽目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

外包干了2个月,技术明显退步了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近5年的功能测试&#xff0c;今年11月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

C语言入门基础知识(一)

#C语言基础知识入门 说明C语言代码块结构 #include <stdio.h> //这个语句的功能是进行有关的预处理操作。include称为文件包命令&#xff0c;后面尖括号中内容称为头部文件或收文件。 #include "demo.h" //导入的是工程内部的头文件 int main() { //main 函…

JVM==>图解字节码指令

一&#xff0c;原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中&#xff0c;交给CPU运行 1&#xff09;常量池载入运行时常量池 我们发现 10 并没有被存入常量池中&#xff0c; 这是因为short范围以内的数字不会…

马斯克极简5步工作法 —— 筑梦之路

马斯克的五步流程法则&#xff1a; 第一步&#xff1a;确定需求 第二步&#xff1a;极力删除零件或过程 第三步&#xff1a;简化和优化 第四步&#xff1a;加快周期时间 第五步&#xff1a;自动化特别注意&#xff1a;完成前三步之前&#xff0c;千万不要考虑加速和自动化&…

关于 Windows 11 显示更多选项

更新 Windows 11 后&#xff0c;右键鼠标出现 显示更多选项&#xff0c;本文解决如何默认显示所有选项 默认显示更多选项 winR打开运行框输入cmd回车输入下面的命令并回车&#xff0c;重启系统 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c9…

GeoServer本地部署与远程访问Web管理页面——“cpolar内网穿透”

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

docker配置redis主从、哨兵集群

搭建redis主从 准备工作 在/usr/local/software/redis/文件夹下建立如下的文件夹、文件 rootlocalhost redis]# mkdir -p 6379/conf 6379/data 6379/log [rootlocalhost redis]# mkdir -p 6380/conf 6380/data 6380/log [rootlocalhost redis]# mkdir -p 6381/conf 6381/…

craco + webpack 4 升 5

craco webpack 4 升 5 更新包版本尝试build升级其他依赖库使用process插件打印进度信息到底需要多少内存分析构建产出添加 splitChunk总结记录一些好文章&#xff1a; 我的项目使用 craco react 开发 我的 package.json {// ......"dependencies": {"ant-desi…

无需服务器,无需魔法,拥有一个微信机器人就是这么简单

前情提要 还没看过的朋友可以看一下上一篇文章《拥有一个微信机器人总共需要几步&#xff1f;》在这篇文章里&#xff0c;我们提到&#xff0c;创建微信机器人需要一个大前提--你得有一台服务器。现在&#xff0c;不再需要了&#xff01;没错&#xff0c;上一篇提到的Serverles…

UVM验证环境 加入env

&#xff08;1&#xff09; 如何在UVM验证环境中例化reference model、scoreboard 如何在在验证平台中加入reference model、scoreboard&#xff0c;这个问题的解决方案是引入一个容器类&#xff0c;在这个容器类中实例化driver、monitor、reference model和scoreboard等。在…

【题目】栈和队列专题

文章目录 专题一&#xff1a;栈系列1. 中缀表达式转后缀表达式&#xff08;逆波兰式&#xff09;2. 有效的括号3. 用栈实现队列4. 最小栈 专题一&#xff1a;栈系列 1. 中缀表达式转后缀表达式&#xff08;逆波兰式&#xff09; 算法原理 2. 有效的括号 题目链接 算法原理 代…