目的:利用Restful服务来收集数据,做了一个缓存,每100条放入Mongodb中,每天要做统计,但是不能保证凌晨的时候数据被刷到了数据库中,利用Timer开另一个线程实现每天零点定时刷数据的功能。
让Tomcat在WEB程序启动的时候启动一个线程池和一个Timer线程,Timer线程每隔一段时间跑一次,然后触发另一个后台线程(甩给线程池去处理)
Listener有两种实现形式:ServletContextListener和HttpSessionListener
1、ServletContextListener
当有新的 context 注册到web服务器时会触发ServletContextListener。
这种方式需要实现:
a. javax.servlet.ServletContextListener 接口
b. contextInitialized(ServletContextEvent sce)
c. contextDestroyed(ServletContextEvent sce)
d. 还需要配置web.xml文件。
example:
StartupListener.java
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.concurrent.Executors;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class StartupListener
implements ServletContextListener
{
public void contextDestroyed(ServletContextEvent sce)
{
sce.getServletContext().log("定时器销毁");
}
public void contextInitialized(ServletContextEvent sce)
{
sce.getServletContext().log("启动线程池");
com.nercel.repository.PoolManager.pool = Executors.newFixedThreadPool(10);
sce.getServletContext().log("启动定时器");
Timer timer = new Timer(true);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
Date time = calendar.getTime();
timer.schedule(new MyTimerTask(sce.getServletContext()), time);
sce.getServletContext().log("已经添加任务调度表");
}
}</span>
MyTimeTask.java
<span style="font-family:Microsoft YaHei;font-size:14px;">import com.nercel.repository.PoolManager;
import java.io.PrintStream;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import javax.servlet.ServletContext;
public class MyTimerTask extends TimerTask
{
private ServletContext context = null;
private int param;
public MyTimerTask(ServletContext context)
{
this.context = context;
}
public void run()
{
this.context.log("开始执行指定定时任务");
PoolManager.pool.execute(new WorkThread(this.param++));
this.context.log("指定定时人物执行结束");
}
}</span>
PoolManager.java
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.util.concurrent.ExecutorService;
public class PoolManager {
public static ExecutorService pool;
}</span>
WorkThead.java
<span style="font-family:Microsoft YaHei;font-size:14px;">import com.nercel.domain.Statistic;
import java.io.PrintStream;
import java.util.ArrayList;
public class WorkThread
implements Runnable
{
private int param;
public int getParam()
{
return this.param;
}
public void setParam(int param) {
this.param = param;
}
public WorkThread(int param)
{
this.param = param;
}
public void run()
{
ContentService insertService = new ContentService();
try
{
insertService.insertData(Statistic.list);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("sucess~!!");
Statistic.list = new ArrayList();
}
}</span>
web.xml
<span style="font-family:Microsoft YaHei;font-size:14px;"><listener>
<listener-class>com.nercel.service.StartupListener</listener-class>
</listener></span>
注:此处为StartupListener所在的包名
2、HttpSessionListener
当有新的Session被创建或是销毁时会触发HttpSessionServlet
HttpSessionServlet需要实现:
a. sessionCreated()
当有新的Session注册到此应用时会调用这个方法。
b. sessionDestroyed()
当有Session从此应用中销毁时调用这个方法。
也需要配置web.xml文件
MySessionListener.java
<span style="font-family:Microsoft YaHei;font-size:14px;">package com.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener{
int newActiveSession=0;
int totalSessionCreated=0;
public void sessionCreated(HttpSessionEvent event) {
System.out.println("New Session is created");
newActiveSession++;
totalSessionCreated++;
System.out.println("Current Active Session :="+newActiveSession);
System.out.println("Total No Session Created :="+totalSessionCreated);
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("Session is destroyed");
newActiveSession--;
}
}</span>
web.xml
<span style="font-family:Microsoft YaHei;font-size:14px;"><web-app>
<display-name>Listener</display-name>
<listener>
<listener-class>com.listener.MySessionListener</listener-class>
</listener>
</web-app></span>
参考:
http://www.cnblogs.com/jersey/archive/2011/03/31/2001420.html
http://www.easywayserver.com/blog/listener-in-java/