java定时器 每天凌晨 固定执行一个方法

定时器怎么写,写在哪?需要运行的方法写在哪儿?

二、如果是需要Tomcat启动就能执行,不需要main方法的定时器的话:
web.xml里面需要这么配置:

<listener>
<listener-class>
com.InitListener
</listener-class>
</listener>
第一个类:InitListener

package com.listener;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
* 系统启动时的监听类 初始化系统数据
*
* @author jhoneder
*
*/
public class InitListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
// context销毁时,销毁初始化数据
}
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
try {
goTimmer();
} catch (Exception e) {
System.out.println("失败:" + e.getMessage());
}
}
private void goTimer() {
Timer timmerTask = new Timer();
Calendar calEnviron = Calendar.getInstance();
// 每天的02:00.am开始执行
calEnviron.set(Calendar.HOUR_OF_DAY, 2);
calEnviron.set(Calendar.MINUTE, 00);
// date为制定时间
Date dateSetter = new Date();
dateSetter = calEnviron.getTime();
// nowDate为当前时间
Date nowDateSetter = new Date();
// 所得时间差为,距现在待触发时间的间隔
long intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();
if (intervalEnviron < 0) {
calEnviron.add(Calendar.DAY_OF_MONTH, 1);
dateSetter = calEnviron.getTime();
intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();
}
// 每24小时执行一次
timmerTask.schedule(new UseTimer(timmerTask), intervalEnviron, 1 * 1000 * 60 * 60 * 24);
}
}

第二个类:

package com.listener;
import java.util.Timer;
import java.util.TimerTask;
/**
* 被调用执行类
*
* @author Administrator
*
*/
public class UseTimer extends TimerTask {
Timer timer = new Timer();
public UseTimer(Timer timer) {
this.timer = timer;
}
/*
* 被调用具体的方法
*/
public void run() {
System.out.println("开始具体执行!");
}
}

不懂得话可以追问!追问

那用spring mvc 怎么写啊,谢谢

追答

一样的啊,spring mvc也算是javaweb项目吧,那web-inf目录下也有web.xml文件吧,项目也得有java代码吧,所以参照上面方式可以应用到spring mvc中;
web.xml里面加上一个listener配置:

com.InitListener

上面的com.InitListener对应到java代码的IninListener类,还有UseTimer也要加上,就行了!

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-10-28
可以通过以下方式实现,

public class TimerManager {
//时间间隔
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
public TimerManager() {
Calendar calendar = Calendar.getInstance();
/*** 定制每日2:00执行方法 ***/
calendar.set(Calendar.HOUR_OF_DAY, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);

Date date=calendar.getTime(); //第一次执行定时任务的时间

//如果第一次执行定时任务的时间 小于 当前的时间
//此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (date.before(new Date())) {
date = this.addDay(date, 1);
}

Timer timer = new Timer();

NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task,date,PERIOD_DAY);
}

// 增加或减少天数
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}

}

public class NFDFlightDataTimerTask extends TimerTask {

private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);

@Override
public void run() {
try {
//在这里写你要执行的内容

} catch (Exception e) {
log.info("-------------解析信息发生异常--------------");
}
}
}

public class NFDFlightDataTaskListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
new TimerManager();
}
public void contextDestroyed(ServletContextEvent event) {
}

}

然后要在web.xml里面配置监听器
<listener>
<listener-class>
com.listener.NFDFlightDataTaskListener
</listener-class>
</listener>
第2个回答  2014-02-10
import java.io.IOException;
import java.util.Timer;

public class TimerTest {

public static void main(String[] args){
Timer timer = new Timer();
//在1秒后执行此任务,每次间隔2秒
//如果传递一个Date参数,就可以在某个固定的时间执行这个任务.
//例如构建一个今天凌晨的Date,为参数1,参数2为24小时后重复执行此任务。
timer.schedule(new MyTask(), 1000, 2000);
while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了
try {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//使用这个方法退出任务
}
} catch (IOException e) {

e.printStackTrace();
}
}
}

static class MyTask extends java.util.TimerTask{
@Override
public void run() {
//这里是你要执行的方法
System.out.println("________");
}
}
}

追问

我的没有main方法,想要的的是只要启动tomcat就能运行,请指教哈,谢谢

追答

这根本不是问题啊。我这只是个例子,所以写个main方法执行。你当然可以不用main方法。
tomcat中直接写个监听器就可以随tomcat启动运行了。

第3个回答  2014-02-10
用一个死循环来代替。然后判断当前时间,如果当前时间为要执行的时间就执行那个方法。另外为了减少资源占用,如果时间固定的话 可以在执行完这个方法之后让线程休眠。
第4个回答  2014-02-10

spring定时任务

追问

能给个例子吗,谢谢哈

相似回答