三种定时器的实现方式

news2024/11/18 3:49:18

一、@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. 测试
    点击新建任务右侧的操作,来执行代码。
    在这里插入图片描述

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

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

相关文章

DeepVoice AI - Text To Voice

No sign-up, No API Keys, no recurr

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

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

Idea 导入Mysql8.0驱动jar包

库是模块可以依赖的已编译代码的集合。在IntelliJ IDEA中&#xff0c;可以在三个级别上定义库&#xff1a; 全局 &#xff08;可用于许多项目&#xff09;&#xff0c; 项目&#xff08;可用于项目中的所有模块&#xff09;和模块 &#xff08;可用于一个模块&#xff09; 简单…

Leetcode 80 删除排序数组中的重复项 II

class Solution {// 双指针// slow代表已完成需要的数组的后一位&#xff0c;即要插入的位置// fast代表待检查的第一个元素public int removeDuplicates(int[] nums) {return f(nums, 2);}public int f(int[] nums, int k){int n nums.length;int slow k;int fast k;while(…

开源CDN软件GoEdge —— 筑梦之路

官方网站&#xff1a;GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件&#xff0c;目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰&#xff0c;安装简单&a…

vue2使用ElementUI

elementui官网&#xff1a;组件 | Element 1、全部引入 下载&#xff1a;npm i element-ui 在 main.js 中写入以下内容&#xff1a;import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(…

12月2号作业

#include <iostream>using namespace std; class Sofa{ private:string setting;string *lying new string;public:Sofa(){cout << "Sofa::无参构造函数" << endl;}Sofa(string setting,string lying):setting(setting),lying(new string (lying)…

封装带插槽的表格

子组件 <template><div><table><thead><tr><th v-for"col,colIndex in columns" :key"colIndex">{{ col.title }}</th></tr></thead><tbody v-if"instList.length >0"><tr …

IDEA 保存自动ESLint格式化

作为后端人员&#xff0c;偶尔修改一下前端代码&#xff0c;ESLint总提示格式不正确。有没有什么办法实现自动格式化呢&#xff1f; 安装插件Save Actions Tool 设置中搜索eslint 勾选 Run eslint --fix on save 这样以后&#xff0c;只要保存文件就会自动格式化了。 参考 …

Python 流程控制

目录 程序流程 顺序结构 分支结构 单分支 双分支 多分支 if 嵌套 循环结构 while循环 for 循环 退出循环 循环与分支嵌套 附录 程序流程 程序是由语句构成&#xff0c;而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑…

vue+electron问题汇总

1. Vue_Bug Failed to fetch extension, trying 4 more times 描述&#xff1a;项目启动时报错 解决&#xff1a;注释图片中内容 2. Module not found: Error: Can’t resolve ‘fs’ in 描述&#xff1a;项目启动报错 解决&#xff1a;vue.config.js中添加图中数据 3.导入…

开会做笔记的时候用什么软件比较好?

在工作生涯中&#xff0c;会经历很多大大小小的会议&#xff0c;而如何快速准确记录下会议上重要的内容&#xff0c;成了很多上班族的必修课。在会上做笔记&#xff0c;选择什么样的工具才能事半功倍&#xff0c;成了一个值得深思的问题。而经过一段时间的测评后&#xff0c;我…

Windows系统下配置多个版本的jdk

1:准备多个版本的jdk 下载地址:Java Downloads | Oracle 2:安装多个版本的jdk 3:跳转到环境变量配置页 主要是配置环境变量,win10系统操作如下 1)搜索控制面板 2)点击系统与安全 3)点击系统 4)点击高级系统设置 5)点击环境变量 4:为多个版本的jdk配置环境变量 将多个版本的jd…

深度学习(五):pytorch迁移学习之resnet50

1.迁移学习 迁移学习是一种机器学习方法&#xff0c;它通过将已经在一个任务上学习到的知识应用到另一个相关任务上&#xff0c;来改善模型的性能。迁移学习可以解决数据不足或标注困难的问题&#xff0c;同时可以加快模型的训练速度。 迁移学习的核心思想是将源领域的知识迁…

专业做除甲醛净化器的品牌 甲醛净化器什么牌子最好用

室内产生了超标的甲醛&#xff0c;大部分都会采取选择甲醛空气净化器来去除&#xff0c;甲醛净化器逐渐成为室内清除甲醛的主力&#xff0c;在选择甲醛净化器时&#xff0c;人们常常会被市场上琳琅满目的空气净化器品牌所迷惑&#xff0c;各品牌和型号都声称自己最好&#xff0…

关于 Windows 11 显示更多选项

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

10、SQL注入——数据库基础

文章目录 一、数据库概述二、数据库分类Mysql数据库连接方法 三、识别数据库四、SQL语法4.1 SQL基本语法4.2 高级操作 一、数据库概述 数据库&#xff08;database&#xff09;&#xff1a;存储在磁盘、磁带、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。数…

Linux常用命令——atq命令

在线Linux命令查询工具 atq 列出当前用户的at任务列表 补充说明 atq命令显示系统中待执行的任务列表&#xff0c;也就是列出当前用户的at任务列表。 语法 atq(选项)选项 -V&#xff1a;显示版本号&#xff1b; -q&#xff1a;查询指定队列的任务。实例 at now 10 minu…

Figma安装指南:新手入门必看!

如果您想下载Figma客户端&#xff0c;可以直接在Figma官网Products>Downloads页面下载。 如果你不能访问Figma的官方网站&#xff0c;即使下载到客户端&#xff0c;你的网络环境也不能正常使用。 因为Figma的服务器在国外&#xff0c;在国内访问时经常会遇到网络不稳定的情…

基于springboot + vue 学生网上请假系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…