77人参与 • 2025-03-08 • Java
项目中需要每天定时更新mysql数据到另一个数据库中,暂定每天中午12:00定时启动更新任务。
使用javajdk自带的timetask和calendar实现定时任务,这种方式可以设置延时,执行间隔,也能设置执行时间点,我用的就是这种。
//第一种:每天中午12点定时开启任务
public static void main(string[] args) {
//calendar这个技术也是基于java的线程去做的
//设置第一次更新的时间点
calendar calendar = calendar.getinstance();
calendar.set(calendar.hour_of_day, 12);//控制小时
calendar.set(calendar.minute, 0);//控制分钟,
calendar.set(calendar.second, 0);//控制秒,
//利用java的api timer来完成一个定时任务
timer timer = new timer();
timertask task=new timertask() {
@override
public void run() {
// 实现自己的定时任务操作
system.out.println("这是一个定时任务!去更新数据库数据!");
}
};
/*
* 从第一次发布任务的12:00开始执行任务,每隔(1000 * 60 * 60 * 24)天,定时执行
* */
timer.schedule(task, calendar.gettime() , 1000 * 60 * 60 * 24);
}
//第二种:定时更新,启动就开始开启定时任务,每隔2秒钟开启一次任务
public static void main(string[] args) {
timertask timertask = new timertask() {
@override
public void run() {
system.out.println("定时任务启动" + new date());
}
};
timer timer = new timer();
//方法参数,定时执行内容,延时(单位毫秒),执行间隔(单位毫秒)
timer.schedule(timertask,100,2000);
}
使用scheduledexecutorservice执行定时任务,这个也是jdk自带的,它执行的定时任务的线程是从线程池中取,任务是并行进行的,互不影响。
/**
* 使用scheduledexecutorservice执行定时任务
*/
public class get003 {
public static void main(string[] args) {
scheduledexecutorservice service = executors.newsinglethreadscheduledexecutor();
//参数;任务体,首次执行的延时时间,任务执行的间隔,间隔时间单位
service.scheduleatfixedrate(()-> system.out.println("任务启动"+new date()),0,3, timeunit.seconds);
}
}(推荐)结合springboot注解实现定时任务,新建一个任务类,在该类上加上@component和@enablescheduling注解,在方法上加上@scheduled注解,在@scheduled注解的属性cron上加上启动时间,然后启动项目,到了任务启动时间就会去执行任务方法。
可以在该类中定义多个定时任务,只需要在每个任务方法上加上@scheduled注解即可。
/**
* 定时任务,主类加上@component和@enablescheduling注解,在方法上加上@scheduled注解
* 注意的是,可以加个开关来决定任务是否执行
*/
@slf4j
@component
@enablescheduling
public class taskinfo {
//从配置文件中读取开关的值
@value("${task.switch.is-open}")
private boolean flag;
@scheduled(cron = "${task.corn.task-corn}")
public void m1() {
//判断开关状态
if (flag){
simpledateformat stf = new simpledateformat("yyyy-mm-dd hh:mm:ss");
string format = stf.format(new date());
system.out.println("定时任务启动->>" + format);
}else {
system.out.println("未开启定时任务开关,请重试!");
}
}
}@value:从配置文件中读取属性值cron:特殊的时间格式,时分秒 年月日都是有不同的表达形式。这里我设置了一个任务开关,当工程部署在多个服务器时,如何我想让某个时间点只有一台机器在跑定时任务,我就可以将其他的开关设置为false,需要启动的那台开关设置为true,可以灵活的控制定时任务的启动,配置文件定时任务配置如下:
#定时任务
task:
switch:
is-open: false #开关
corn:
task-corn: 0 48 21 * * ? #定时任务时间格式2021-08-16 21:47:31.255 info 8888 --- [ main] o.apache.catalina.core.standardservice : starting service [tomcat]
2021-08-16 21:47:31.255 info 8888 --- [ main] org.apache.catalina.core.standardengine : starting servlet engine: [apache tomcat/9.0.38]
2021-08-16 21:47:31.555 info 8888 --- [ main] o.a.c.c.c.[tomcat].[localhost].[/] : initializing spring embedded webapplicationcontext
2021-08-16 21:47:31.555 info 8888 --- [ main] w.s.c.servletwebserverapplicationcontext : root webapplicationcontext: initialization completed in 1174 ms
2021-08-16 21:47:31.956 info 8888 --- [ main] o.s.s.concurrent.threadpooltaskexecutor : initializing executorservice 'applicationtaskexecutor'
2021-08-16 21:47:32.104 info 8888 --- [ main] o.s.s.c.threadpooltaskscheduler : initializing executorservice 'taskscheduler'
2021-08-16 21:47:32.151 info 8888 --- [ main] o.s.b.w.embedded.tomcat.tomcatwebserver : tomcat started on port(s): 8080 (http) with context path ''
2021-08-16 21:47:32.165 info 8888 --- [ main] com.cry.pdoswebapplication : started pdoswebapplication in 2.181 seconds (jvm running for 3.035)
进销存web启动成功!
未开启定时任务开关,请重试!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论