您的位置:首页 > 其它

用ServletContextListener和Task,Timer实现WEB服务器的定时操作

2016-08-10 10:32 435 查看
有个项目需要在WEB服务器上实现定时从不同的数据库中取出更新以后的数据,提供给客户端JS读取,一开始考虑的是用Servlet来实现,在Servlet里面来开线程处理这个问题。后来,找到了这些资料: http://wuyue37307.blog.163.com/blog/static/27583712010074564493/ http://blog.sina.com.cn/s/blog_4679d9850100987y.html
发现,可以使用ServletContextListener来完成这个功能。因为Servlet毕竟需要一个启动或者称为叫激活的操作,但这个操作什么时候完成,由谁来完成,是个问题。而ServletContextListener则在应用程序一开始启动时就会自动调用 public void contextInitialized(ServletContextEvent
event);而在应用程序停止时会自动调用 public void contextDestroyed(ServletContextEvent event)。而使用Timer和TimerTask则可以指定一个任务的开始时间和执行间隔时间。

代码基本是前面两个博客上的内容:

package mking;

import java.util.TimerTask;

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

/**
 * 上下文监听器,需要在web.xml中进行配置,请参见<listener></listener>结点
 * @author Administrator
 *
 */
public class MyContextListener implements ServletContextListener {
private java.util.Timer timer = null;
private ServletContext context = null;

public void contextInitialized(ServletContextEvent event) {
this.context = event.getServletContext();
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
//设定MyTask中任务每5秒执行一次,0表示马上执行,可以改为2000,则表示2秒以后开始执行
//以后都按后面指定的每5秒执行一次
timer.schedule(new MyTask(this.context), 0, 5 * 1000);
event.getServletContext().log("已经添加任务调度表");
}

public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
this.context.log("定时器销毁");
this.context = null;
}

private static class MyTask extends TimerTask {
private static boolean isRunning = false;
private ServletContext context = null;

public MyTask(ServletContext context) {
this.context = context;
}

//下面的方法会按之前设定的每5秒执行一次,所以,此处不需要循环
public void run() {
if (!isRunning) {
isRunning = true;
context.log("开始执行指定任务");

// TODO 添加自定义的详细任务,以下只是示例
// 这里完成从数据库取数据,然后存放到MySQL数据库中
int i = 0;
while (i++ < 10) {
context.log("已完成任务的" + i + "/" + 10);
}

isRunning = false;
context.log("指定任务执行结束");
} else {
context.log("上一次任务执行还未结束");
}
}
}
}

需要注意的是,该监听器必须要在web.xml中配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 下面是配置上下文的监听器,在监听器中完成任务的注册和撤销 -->
<listener>
  
<listener-class>mking.MyContextListener</listener-class>
</listener>
</web-app>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: