java怎么让程序每天晚上12点做定时任务,因为程序是不定时开的,所以要实时监听系统时间。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java怎么让程序每天晚上12点做定时任务,因为程序是不定时开的,所以要实时监听系统时间。相关的知识,希望对你有一定的参考价值。

java定时任务,每天定时执行任务(JDK TimerTask)
标签: taskTasktimerTimer
2013-01-14 13:28 8747人阅读 评论(0) 收藏 举报
01 public class TimerManager
02
03 //时间间隔
04 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
05
06 public TimerManager()
07 Calendar calendar = Calendar.getInstance();
08
09 /*** 定制每日2:00执行方法 ***/
10
11 calendar.set(Calendar.HOUR_OF_DAY, 2);
12 calendar.set(Calendar.MINUTE, 0);
13 calendar.set(Calendar.SECOND, 0);
14
15 Date date=calendar.getTime(); //第一次执行定时任务的时间
16
17 //如果第一次执行定时任务的时间 小于 当前的时间
18 //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
19 if (date.before(new Date()))
20 date = this.addDay(date, 1);
21
22
23 Timer timer = new Timer();
24
25 NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
26 //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
27 timer.schedule(task,date,PERIOD_DAY);
28
29
30 // 增加或减少天数
31 public Date addDay(Date date, int num)
32 Calendar startDT = Calendar.getInstance();
33 startDT.setTime(date);
34 startDT.add(Calendar.DAY_OF_MONTH, num);
35 return startDT.getTime();
36
37
38

在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后
发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况
发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。

01 public class NFDFlightDataTimerTask extends TimerTask
02
03 private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);
04
05 @Override
06 public void run()
07 try
08 //在这里写你要执行的内容
09
10 catch (Exception e)
11 log.info("-------------解析信息发生异常--------------");
12
13
14
15
16 public class NFDFlightDataTaskListener implements ServletContextListener
17
18 public void contextInitialized(ServletContextEvent event)
19 new TimerManager();
20
21
22 public void contextDestroyed(ServletContextEvent event)
23
24
25

然后要在web.xml里面配置监听器
1 <listener>
2 <listener-class>
3 com.listener.NFDFlightDataTaskListener
4 </listener-class>
5 </listener>
参考技术A 使用 quartz
只要简单的几步配置,就能实现 调度

如果项目中使用了 spring ,还能和 spring 无缝集成
参考技术B 使用 Quartz 框架,可以完成各种各种调度。你需要花点时间成本,学习下这个框架。不难的。 参考技术C 最简单的 是使用 quartz

只要简单的几步配置,就能实现 调度

如果你项目中使用了 spring ,还能和 spring 无缝集成

我们目前的项目 一直采用了 quartz本回答被提问者采纳
参考技术D 一种是通过配置操作系统的定时任务来实现,比如crontab
一种是通过Java的timetask来实现

用java做了一个简单的定时任务工程,不知道如何让它在服务器上运行起来?应该怎么做???

这个是我在网上找的不知道是不是你要的:

java定时任务Timer 关于定时任务,似乎跟时间操作的联系并不是很大,但是前面既然提到了定时任务,索性在这里一起解决了。设置定时任务很简单,用Timer类就搞定了。一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。代码如下:
package test;
import java.util.Timer;
public class TimeTaskTest
public static void main(String[] args) Timer timer = new Timer();
timer.schedule(new Task(), 60 * 1000);


解释一下上面的代码。上面的代码实现了这样一个功能,当TimeTask程序启动以后,过一分钟后执行某项任务。很简单吧:先new一个Timer对象,然后调用它的schedule方法,这个方法有四个重载的方法,这里我们用其中一个,
public void schedule(TimerTask task,long delay)
首先,第一个参数第一个参数就是我们要执行的任务。这是一个TimerTask对象,确切点说是一个实现TimerTask的类的对象,因为TimerTask是个抽象类。上面的代码里 面,Task就是我们自己定义的实现了TimerTask的类,因为是在同一个包里面,所以没有显性的import进来。Task类的代码如下
package test;
import java.util.TimerTask;
public class Task extends TimerTask public void run()

System.out.println("定时任务执行");


我们的Task必须实现TimerTask的方法run,要执行的任务就在这个run方法里面,这里,我们只让它往控制台打一行字。第二个参数第二个参数是一个long型的值。这是延迟的时间,就是从程序开始以后,再过多少时间来执行定时任务。这个long型的值是毫秒数,所以前面我们的程序里面,过一分钟后执行用的参数值就是 60 * 1000。二、循环执行设置定时任务的时候,往往我们需要重复的执行这样任务,每隔一段时间执行一次,而上面的方法是只执行一次的,这样就用到了schedule方法的是另一个重载函数public void schedule(TimerTask task,long delay,long period)
前两个参数就不用说什么了,最后一个参数就是间隔的时间,又是个long型的毫秒数(看来java里涉及到时间的,跟这个long是脱不了干系了),比如我们希望上面的任务从第一次执行后,每个一分钟执行一次,第三个参数值赋60 * 1000就ok了。三、指定执行时间既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少。没关系,schedule四个重载的方法还没用完呢。用下面这个就OK了:
public void schedule(TimerTask task,Date time)
比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了。有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了。schedule最后一个重载的方法是public void schedule(TimerTask task,Date firstTime,long period)
没必要说什么了吧:)四、j2ee中的定时任务在实际的项目中,往往定时任务需要对web工程中的资源进行操作,这样一来,用上面的单个程序的方式可能就有点力不从心了,因为很多web工程的资源它操作不到。解决的办法是,使用Servlet,把执行定时任务的那些代码放到Servlet的init()函数里就可以了,这个easy,就没有必要再写示例代码了吧
参考技术A 单击开始,单击所有程序,指向附件,指向系统工具,然后单击任务计划 参考技术B 2楼正解,还要把你的java程序做成一个批处理追问

就是做成批处理后 执行不了,批处理怎么做?

追答

新建个记事本,然后扩展名改成.bat,再把java的class文件跟批处理一起放到个文件夹里java 工程名

参考技术C 是打了一个jar包吗,定时任务使用 quartz写的吗 ,请详细的描述

以上是关于java怎么让程序每天晚上12点做定时任务,因为程序是不定时开的,所以要实时监听系统时间。的主要内容,如果未能解决你的问题,请参考以下文章

Centos crontab定时任务

CentOS7定时任务配置与使用

分布式定时调度-xxl-job

分布式定时调度:xxl-job 万字详解

windows怎么定时执行脚本

Mysql每天晚上十二点都会是提示这个怎么回事??