Java-定时任务
文章目录
- 补充: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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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-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项目整合
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.xuxueligroupId><artifactId>xxl-job-coreartifactId><version>2.2.0version>
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 {@Overridepublic ProcessResult process(TaskContext context) throws Exception {// powerjob在线日志功能,使用该log可以直接在控制台查看OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("程序正在启动,定时任务开启:{}",context);return new ProcessResult(true,"成功");}
}

9、进入页面创建任务
任务管理-新建任务

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
