文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java-定时任务

2023-09-23 13:25

关注

文章目录

补充: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创建简单的周期性任务,也可以创建复杂的作业调度,例如每周一次的作业

导入依赖

<dependency>    <groupId>org.quartz-schedulergroupId>    <artifactId>quartzartifactId>    <version>2.3.0version>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项目整合

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

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

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

在项目中导入依赖

<dependency>    <groupId>com.xuxueligroupId>    <artifactId>xxl-job-coreartifactId>    <version>2.2.0version>dependency>

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

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

#xxljob定时任务xxl.job.admin.addresses=http://192.168.129.1:8080/xxl-job-admin### xxl-job, access tokenxxl.job.accessToken=default_token### xxl-job executor appnamexxl.job.executor.appname=xxl-job-executor-sample### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is nullxxl.job.executor.address=### xxl-job executor server-infoxxl.job.executor.ip=xxl.job.executor.port=9999### xxl-job executor log-pathxxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### xxl-job executor log-retention-daysxxl.job.executor.logretentiondays=30

编写自己的定时任务

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

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


方式七:powerjob

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

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

从github中下载项目

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

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

CREATE DATABASE IF NOT EXISTS powerjob-daily DEFAULT CHARSET utf8mb4

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

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

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

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

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

打开页面

http://localhost:7700/

注册应用

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

编写示例代码

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

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

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

@Slf4j@Componentpublic 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,"成功");    }}

在这里插入图片描述

进入页面创建任务

任务管理-新建任务

在这里插入图片描述

来源地址:https://blog.csdn.net/qq_52998673/article/details/131208724

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯