您的位置:首页 > 编程语言 > Java开发

Java Web的Timer详解

2014-03-20 19:34 316 查看
目的:利用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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: