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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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也要加上,就行了!

参考技术A 可以通过以下方式实现,

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>
参考技术B 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启动运行了。

参考技术C 用一个死循环来代替。然后判断当前时间,如果当前时间为要执行的时间就执行那个方法。另外为了减少资源占用,如果时间固定的话 可以在执行完这个方法之后让线程休眠。 参考技术D

spring定时任务

追问

能给个例子吗,谢谢哈

以上是关于java定时器 每天凌晨 固定执行一个方法的主要内容,如果未能解决你的问题,请参考以下文章

java Timer 定时每天凌晨0点执行任务

java Timer 定时每天凌晨1点执行任务

java Timer 定时每天凌晨1点执行任务

java定时执行任务

设置定时任务为每天凌晨2点执行和每小时执行一次

spring怎么设置定时任务为每天凌晨2点执行和每小时执行一次?