启动服务时,要求启动定时器进行相关的业务处理。
这里使用到两项技术: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>