在携程程序中,我们经常会遇到要求能够在项目部署上线后能够定时执行,自动执行的要求。现在我就带大家写一个简单的定时器,改定时器可以实现项目部署在tomcat后便可以自动运行,无需执行其他任何操作。首先我们来了解一下编写的思路。
1、根据要求是要在tomcat启动的时候就执行,所以我们必须在web.xml中加入一个监听类。tomcat一启动监听类便自动执行。
如何实现这一监听类?我们需要实现ServletContextListener类来监听tomcat的启动,终止。这样就能实现监听类在tomcat启动的时候实现自动执行下面直接上代码。
package com.hongyu.utils;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class AutoRunTimerListener implements ServletContextListener {
//当servlet容器终止web应用是会自动调用该方法。在调用改方法时会自动销户全部的servlet和filter
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("定时发送Xml信息监听--已关闭!");
}
//当servlet容器启动web应用是调用改方法,调用胡容器在初始化filter,并对需要被初始化的servlet和filter急性型初始化
@Override
public void contextInitialized(ServletContextEvent sce) {
// 指定的任务,从指定的延迟后,开始进行重复执行。
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
/**
* 定制每天的10:00:00执行,
* 若程序已超过10点启动,当天不再执行,
* 等到明日10点再执行
* * 这样保证了时间一直是10点,
* 而不会变成程序启动时间 */
calendar.set(year, month, day, 10, 00, 00);
Date defaultdate =calendar.getTime();// 今天10点(默认发送时间)
Date sendDate =new Date(); // 10点后开机
//判断当前的时间是否大于10点,如果是则当天不再执行,如果不是则执行该程序
if (defaultdate.before(new Date())) {
// 将发送时间设为明天10点
calendar.add(Calendar.DATE, 1);
sendDate = (Date) calendar.getTime();
}
/**
* 使用java中自带的定时类。run方法中便是要定时执行的代码或者方法
* sTime.schedule(task, delay, period);
* task代表要执行的任务,delay表示要延迟执行的时间,period表示要定时执行的频率。
*/
Timer sTime=new Timer();
sTime.schedule(new TimerTask() {
@Override
public void run() {
//需要定时执行的代码写在此处
System.out.println(new Date()+"我正在执行");
}
}, sendDate, 1000*60);
}
}
编写监听类后,我们需要在web.xml中进行配置
<listener>
<listener-class>com.hongyu.utils.AutoRunTimerListener</listener-class>
</listener>
执行的结果
以上的的简单的定时器实现了在判断一天的时间是否在10点钟之前,是则开始执行程序,不是则明日开始执行该程序。