Java-定时任务

news2024/11/22 7:04:18

文章目录

  • 补充:cron表达式
  • 基本知识
  • 方式一:使用sleep方法
  • 方式二:JDK Timer和TimerTask
  • 方式三:JDK ScheduledExecutorService
  • 方式四: Spring Task 中 的 @Scheduler
  • 方法五、Quartz框架
  • 方式六:XXL-JOB
    • 将xxl-job与springboot项目整合
  • 方式七:powerjob

补充:cron表达式

秒 分 时 日期 月份 星期

如果日期有则星期为?

如果星期有则日期为?


基本知识

调度器 Scheduler : 运行到触发时间点

触发器 Trigger : 到达某一时间点后触发闹钟

执行器 Executors : 触发闹钟后执行响声


方式一:使用sleep方法

无法指定时间

public class SleepDemo1 {
    public static void main(String[] args) {
        Runnable task = new Runnable(){
            @Override
            public void run() {
                while (true){
                    System.out.println("hello");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        };

        Thread thread = new Thread(task);
        thread.start();
    }
}

方式二:JDK Timer和TimerTask

因为第一种的定时任务方法

java.util.Timer、java.util.TimerTask 非线程安全

每隔1秒执行1次

public class TimerDemo2 {
    public static void main(String[] args) {
        TimerTask task = new TimerTask(){
            @Override
            public void run() {
                System.out.println("hello");
            }
        };
        Timer timer = new Timer();
        long delay = 1000;
        long interval = 2000;
        timer.schedule(task,delay,interval);
    }
}


方式三:JDK ScheduledExecutorService

java.util.concurrent.ScheduledExecutorService

可以使用它创建和执行定期执行的任务,并且可以控制任务的执行频率。

使用Executors类的newScheduledThreadPool方法创建了一个ScheduledExecutorService对象,并使用该对象的scheduleAtFixedRate方法将任务安排在每隔1秒钟执行一次。可以根据需要更改任务的执行频率。

public class ScheduleExcutorsDemo3 {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        Runnable task = new Runnable(){
            @Override
            public void run() {
                System.out.println("hello");
            }
        };
        scheduledExecutorService.scheduleAtFixedRate(task,0,1, TimeUnit.SECONDS);
    }
}

方式四: Spring Task 中 的 @Scheduler

可以使用@Scheduled注解实现定时任务。该注解可以在Spring项目中使用,以在指定的时间间隔内自动调用指定方法。

每隔1秒钟打印“hello timer”:

import org.springframework.scheduling.annotation.Scheduled; 

public class ScheduledAnnotationExample { 
    @Scheduled(fixedRate = 1000) 
    public void printMessage() { 
        System.out.println("hello timer"); 
    } 
}

方法五、Quartz框架

可以使用Quartz创建简单的周期性任务,也可以创建复杂的作业调度,例如每周一次的作业

1、导入依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

方式六:XXL-JOB

分布式任务调度平台

下载代码:https://gitee.com/xuxueli0323/xxl-job,通过git clone

将SQL运行到navcate中:doc/db/xxx.sql 找到克隆下来的项目中该目录下的sql文件 Navicat创建相对应的数据库

修改admin下的配置文件:邮箱、数据库连接(jdbc:mysql://localhost:3306/xxl_job?serverTimeZone=Asia/Shanghai)

运行启动类

访问 http://localhost:8080/xxl-job-admin 默认账户admn,密码123456

编写一个自己的代码

在这里插入图片描述

在页面中添加定时任务并启动运行

在这里插入图片描述

运行报错:执行器地址为空

打开页面中的执行器管理,新增一条

Appname在代码中springboot项目配置文件下的appname,因为是自动注册所以不用添加地址

注意:代码不止需要运行admin的启动类,两个都需要运行

在这里插入图片描述


将xxl-job与springboot项目整合

1、将源代码中的admin打包 clear - install 然后将jar包复制到自定义的文件夹中,在该文件夹的目录下启动

java -jar xxl-job-admin-2.4.1-SNAPSHOT.jar

访问:http://localhost:8080/xxl-job-admin/

2、在项目中导入依赖

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.2.0</version>
</dependency>

3、将xxl-job-executor-sample-springboot这个模块下的XxlJobConfig复制一份到springboot的项目中,然后将相关配置设置好即可(第4步 复制粘贴)

4、配置文件(使用application.properties才能正确不能用yml)

#xxljob定时任务
xxl.job.admin.addresses=http://192.168.129.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=default_token

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

5、编写自己的定时任务

@Component
public class MyTestHandler extends IJobHandler {
    @Override
    @XxlJob(value = "mytest1")
    public void execute() throws Exception {
        System.out.println("成功啦");
    }
}

6、在网页中添加定时任务执行器然后启动


方式七:powerjob

相比于xxl-job更加的复杂,可以个性化,每一个appname达到了隔离

https://www.yuque.com/powerjob/guidence/bdvp1u#4DTFD

1、从github中下载项目

git clone https://github.com/PowerJob/PowerJob.git

2、创建一个数据库(对比xxl-job来说更加的简洁,只需要创建数据库即可)

CREATE DATABASE IF NOT EXISTS powerjob-daily DEFAULT CHARSET utf8mb4

3、修改配置文件中修改数据库的配置

powerjob-server/powerjob-server-starter/application-daliy.properties

jdbc:mysql://localhost:3306/powerjob-daily?serverTimeZone=Asia/Shanghai

4、运行serve/starter下的主启动类PowerJobServerApplication

如果运行不了,需要使用maven的clear以及install

5、打开页面

http://localhost:7700/

6、注册应用

填入powerjob-agent-test(需要与第七步中appname一致)和注册密码

7、编写示例代码

powerjob-worker-samples/application.properties修改app-name(与第六步一致)

8、编写自己的代码(建立一个新的类,继承想要使用的处理器)然后运行主启动类

各个处理器:https://www.yuque.com/powerjob/guidence/hczm7m

@Slf4j
@Component
public class TestHandler implements BasicProcessor {
    @Override
    public ProcessResult process(TaskContext context) throws Exception {
        // powerjob在线日志功能,使用该log可以直接在控制台查看
        OmsLogger omsLogger = context.getOmsLogger();
        omsLogger.info("程序正在启动,定时任务开启:{}",context);
        return new ProcessResult(true,"成功");
    }
}

在这里插入图片描述

9、进入页面创建任务

任务管理-新建任务

在这里插入图片描述

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

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

相关文章

canvas实现简易画板

效果图如下&#xff1a; 实现功能&#xff1a; 1、改变画笔粗细 2、保存签名实现下载功能 3、使用橡皮擦功能 4、清空画布 5、改变画笔颜色 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta …

ChatGPT新功能曝光:可记住用户信息、上传文件和工作区

&#x1f989; AI新闻 &#x1f680; ChatGPT新功能曝光&#xff1a;可记住用户信息、上传文件和工作区 摘要&#xff1a;一张神秘截图曝光了ChatGPT新功能&#xff0c;包括可记住用户信息的"My profile"、上传和管理文件的"My files"以及可以让AI使用不…

从Wi-Fi,蓝牙,到4G,5G,到卫星网络,频谱共享已无处不在

在智能手机像牙刷一样普及的今天&#xff0c;频谱共享&#xff0c;成为了近些年通信界的一个热词儿。频谱因为通信的重要而变得越发重要&#xff0c;又因为频谱是一种稀缺资产&#xff0c;而使用需求又在日益飞速地增长&#xff0c;所以成为重中之重。智能手机、物联网、军事和…

【QT】枚举常用宏到底有什么作用?(Q_ENUM,Q_FLAG,Q_DECLARE_FLAGS,Q_DECLARE_OPERATORS_FOR_FLAGS)

目录 1. Q_ENUM宏 与 QMetaEnum类1.1 Q_ENUM宏的作用1.2 使用Q_ENUM注意的问题1.3 在写有关枚举的代码时&#xff0c;我们可能遇到这种情况&#xff1a;需要用到枚举的字符串&#xff0c;该怎么办&#xff1f;1.4 下面通过一段简单的代码来说明Q_ENUM的作用 2. Q_FLAG宏2.1 Q_F…

satellite: 利用TLE动态计算并实时显示多颗卫星的位置及轨迹

本示例的目的是介绍演示如何在vue+satellite项目中利用两行根数动态地计算,并显示多个卫星的位置及轨迹。每秒钟更新一下卫星的位置和角度,加载当前时间到固定时间(如720分钟后)的一段轨迹。 直接复制下面的 vue+openlayers源示例代码,操作2分钟即可运行实现效果 文章目…

DDD领域驱动设计基本理解

DDD是一种软件设计思想和方法论&#xff0c;以领域为核心构建软件设计体系&#xff0c;将业务模型抽象成领域模型进行拆解和封装。本文简要介绍DDD的基本概念和常用的分层设计架构&#xff0c;并结合业务场景进行领域驱动设计的实战分析&#xff0c;以加深理解。 1、DDD领域驱动…

opencv通过轮廓去除虚线

思路&#xff1a; 将虚线膨胀为实线&#xff0c;通过高度和宽度找到轮廓&#xff0c;再将轮廓内的面积涂白色 img cv2.imread(imagePath) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray_test gray.copy() binary_test cv2.adaptiveThreshold(clean_gray(gray_test),25…

做项目,最难搞定的不是甲方爸爸...

早上好&#xff0c;我是老原。 前几天和一个老朋友吃饭的时候&#xff0c;他和我吐槽他上个月做的一个项目&#xff0c;实在太累了&#xff0c;几乎是没日没夜地赶进度&#xff0c;身体都快垮了。 我问他既然时间来不及&#xff0c;为什么不前期就和客户沟通好。 他说其实客…

uni-app 的使用体验总结

框架简介 uni-app 是一个使用 Vue.js (opens new window)开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;…

【自然语言处理】COLD:中文攻击性言论检测数据集

COLD&#xff1a;A Benchmark for Chinese Offensive Language Detection 文章目录 COLD&#xff1a;A Benchmark for Chinese Offensive Language Detection1 论文出处2 背景2.1 背景介绍2.2 针对问题2.3 创新点 3 数据集构建3.1 数据源3.2 效率改进3.3 数据集分析 4 实验设计…

驱动开发:内核物理内存寻址读写

在某些时候我们需要读写的进程可能存在虚拟内存保护机制&#xff0c;在该机制下用户的CR3以及MDL读写将直接失效&#xff0c;从而导致无法读取到正确的数据&#xff0c;本章我们将继续研究如何实现物理级别的寻址读写。 首先&#xff0c;驱动中的物理页读写是指在驱动中直接读…

LiveGBS流媒体平台GB/T28181功能-海康大华宇视华为NVR等4G摄像头自带物联网卡注册国标平台后看不到设备的时候如何排查及抓包

LiveGBS流媒体平台GB/T28181功能-海康大华宇视华为NVR等4G摄像头自带物联网卡注册国标平台后看不到设备的时候如何排查及抓包 1、设备注册后查看不到1.1、是否是4G|5G摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡…

【Nexus】Maven从Nexus中下载jar包

目录 一、前言二、配置Apache Maven1、在Maven的settings.xml中添加一个镜像配置&#xff0c;并覆盖中央仓库的默认配置 二、创建Maven项目&#xff0c;配置pom文件拉取Nexus中的jar包1、确定配置的Maven的settings.xml是否是上一步修改的settings.xml文件&#xff0c;以及repo…

规划地类、用途分区、空间管制区代码对应表

规划地类、用途分区、空间管制区代码对应表 —the—end—

UE5 与 C++ 入门教程·第一课:角色与 Enhanced Input

本文主要围绕 UE5 新的输入系统&#xff0c;手把手从 0 搭建 Unreal 项目&#xff0c;实现角色的基础移动。 重要提示&#xff1a;众所周知&#xff0c;C 属于编译型语言&#xff0c;因此动态灵活性不足&#xff0c;不过执行效率高&#xff0c;而蓝图简单灵活&#xff0c;却执行…

探索TCC:释放高可用性和弹性事务的潜力

1、TCC简介 分布式事务是指在分布式系统中&#xff0c;多个服务之间需要保证数据的一致性和完整性的场景。传统的单机事务无法满足分布式系统的需求&#xff0c;因此需要引入一种新的事务模型来解决分布式事务问题。 TCC&#xff08;Try-Confirm-Cancel&#xff09;是一种基于…

MySQL的分库分表

分必要不要分库分表&#xff08;通过优化之后还明显影响业务再分&#xff0c;可以通过监控慢查询确定&#xff09; 分库分表的一般条件:单表数据量超过1000w&#xff08;阿里应该是说5000w&#xff09;或者单表数据文件(.ibd)超过20GB&#xff0c;这个很重要&#xff0c;&…

点云配准综述一篇综述《A comprehensive survey on point cloud registration》(翻译)

参照了 2021最新关于点云配准的全面综述 - 知乎&#xff0c;并且加了些自己翻译&#xff0c;全篇的内容可能稍有删减。主要作为个人笔记&#xff0c;阅读了几篇综述&#xff0c;发现这篇是质量较好的&#xff0c;值得花时间细读。 文章分类 文章将配准方法分为了同源配准和不…

JMeter三大重要组件——线程组、取样器、查看结果数(3)

JMeter三大重要组件 一、JMeter三大重要组件——线程组1、作用&#xff1a;JMeter主要通过线程组来运行用户脚本2、在取样器错误后要执行的动作&#xff1a;3、线程属性3、调度器4、setUp线程组和tearDown线程组 二、JMeter三大重要组件——取样器1、基本a、自动重定向和跟随重…

Obsidian多端同步插件LiveSync

网友 Leo 和 Paco反馈&#xff0c;群晖升级到 DSM7.2 &#xff0c;注册表可以搜索镜像&#xff0c;根据 Leo 贴的 /var/packages/Docker/etc/dockerd.json 的内容&#xff0c;DSM7.2 应该是使用了 https://docker.nju.edu.cn 作为注册表镜像&#xff0c;但老苏测试过下面几种情…