Web服务启动时 启动定时器处理相关业务

时间:2022-12-29 16:47:57

       启动服务时,要求启动定时器进行相关的业务处理。

     这里使用到两项技术:1、jsp中的ServletContextListener  来监听web应用的启动和关闭。

                                         2、定时器的使用。 

     以下是相关代码:

package neo.app.servlet;

import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* 定时处理相关业务
*
*/
public class ContextListener implements ServletContextListener {


private final Log log = LogFactory.getLog(getClass());

private Timer timer = null; //定时器
private static int DOWNlOAD_HOUR = 0; //执行任务开始时间(时)
private static int DOWNlOAD_MINUTE = 0; //执行任务开始时间(分)
private static int DOWNlOAD_SECOND = 0; //执行任务开始时间(秒)
private long delay; //延时时间值(当前系统时间到下载时间之间的时间差毫秒数)

public void contextDestroyed(ServletContextEvent event) {
log.info("begin 定时器销毁");
timer.cancel();

}
public void contextInitialized(ServletContextEvent event) {

log.info("begin 定时器启动");
init();//初始化参数
timer = new Timer(true);//创建Timer对象
//定时执行程序
String filePath = event.getServletContext().getRealPath("/ckplayer");
//调用Handle()类(即每天要执行的任务),delay表示延迟毫秒数,0,24*60*60*1000表示每隔一天执行一次任务,60*60*1000表示一个小时;
timer.schedule(new MyTask(filePath),delay,24*60*60*1000);
}

public void init(){

//声明一个Calendar对象
Calendar cal = Calendar.getInstance();
//设置时间
cal.set(Calendar.HOUR_OF_DAY, DOWNlOAD_HOUR);
cal.set(Calendar.MINUTE, DOWNlOAD_MINUTE);
cal.set(Calendar.SECOND, DOWNlOAD_SECOND);
Date date = new Date();
//获取设定的时间
date = cal.getTime();
//声明当前时间
Date now = new Date();
//获取设定的时间和当前的时间差(毫秒数)
long interval = date.getTime() - now.getTime();

//如果当前时间大于下载时间,则将下载时间设置为下一个下载时间
if (interval < 0) {
cal.add(Calendar.DAY_OF_MONTH, 1);//将天数加1
date = cal.getTime(); //获取设定的时间和当前的时间差(毫秒数)
interval = date.getTime() - now.getTime();
}
delay = interval;
}

}
class MyTask extends TimerTask {
private final Log log = LogFactory.getLog(getClass());
Timer timer = null;
private String filePath = "";

public MyTask(String f) {
filePath = f;

}
/**
* 开始执行 */
public void run() {
//开始执行
log.info(filePath);
                        //这里是要处理的具体业务方法 同步用户信息
                        syschronizeSNSUser();  }}


最后在web。xml文件中对ServletContextListener类进行配置,如下所示:

<listener> 
<listener-class>neo.app.servlet.ContextListener</listener-class>
</listener>