Java Web的Timer详解

目的:利用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/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值