Java Web的Timer详解
2014-03-20 19:34
316 查看
目的:利用Restful服务来收集数据,做了一个缓存,每100条放入Mongodb中,每天要做统计,但是不能保证凌晨的时候数据被刷到了数据库中,利用Timer开另一个线程实现每天零点定时刷数据的功能。
让Tomcat在WEB程序启动的时候启动一个线程池和一个Timer线程,Timer线程每隔一段时间跑一次,然后触发另一个后台线程(甩给线程池去处理)
Listener有两种实现形式:ServletContextListener和HttpSessionListener
这种方式需要实现:
a.
javax.servlet.ServletContextListener 接口
b.
contextInitialized(ServletContextEvent sce)
c.
contextDestroyed(ServletContextEvent sce)
d.
还需要配置web.xml文件。
example:
StartupListener.java
MyTimeTask.java
PoolManager.java
WorkThead.java
web.xml
注:此处为StartupListener所在的包名
HttpSessionServlet需要实现:
a. sessionCreated()
当有新的Session注册到此应用时会调用这个方法。
b. sessionDestroyed()
当有Session从此应用中销毁时调用这个方法。
也需要配置web.xml文件
MySessionListener.java
web.xml
参考:
http://www.cnblogs.com/jersey/archive/2011/03/31/2001420.html
http://www.easywayserver.com/blog/listener-in-java/
让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被创建或是销毁时会触发HttpSessionServletHttpSessionServlet需要实现:
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/
相关文章推荐
- java获取当前项目路径
- Java相对路径读取文件
- struts2零配置
- Java的递归算法
- Eclipse+PyDev 安装和配置
- java 使用dom4j解析xml
- Java字符串格式化 String。format()的使用
- java异常处理原则
- java dom4j操作xml
- java 实验二
- 项目中servlet和struts2共存的解决方案
- myeclipse 调试
- 设置JAVA_HOME和JRE_HOME
- 为什么Spring MVC访问jsp页面报错
- spring整合hessain 访问远程服务
- MyEclipse 全面的快捷键
- 《java核心技术》(原书第七版)读书笔记之第四章
- java中的生产者与消费者问题(多线程)
- 常用eclipse插件集合, 持续更新
- java,SimpleDateFormat,时间格式化