随web应用启动而自启动的后台线程
当前遇到一个需求:
需要在web应用启动的时候就启动一个线程定时的来做某项工作。
有两种解决方法:
1.增加一个监听器Listener来实现相关功能。
2.增加一个随项目启动的servlet来实现相关功能。
这里Listener和随项目启动的servlet都可以随着项目启动而启动,只是启动的时序有所不同:
接下来分别实现下:
1.Listener实现:看代码
package com.web.cloudAgent.servlet; import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class LoadBalanceListener implements ServletContextListener
{
private MyThread myThread;
@Override
public void contextDestroyed(ServletContextEvent arg0)
{
// TODO Auto-generated method stub
if (myThread != null && myThread.isInterrupted()) {
myThread.interrupt();
}
} @Override
public void contextInitialized(ServletContextEvent arg0)
{
// TODO Auto-generated method stub
String str = null;
if (str == null && myThread == null) {
myThread = new MyThread();
myThread.start();
}
}
}
/**
* 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
*/
class MyThread extends Thread {
public void run(){
while (!this.isInterrupted()) {// 线程未中断执行循环
try {
Thread.sleep(2000); //每隔2000ms执行一次
System.out.println("定时执行");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
然后需要将Listener配置到web.xml中:
<listener>
<listener-class>com.web.cloudAgent.servlet.LoadBalanceServlet</listener-class>
</listener>
2.servlet实现:
package com.web.cloudAgent.servlet; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoadBalancesServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
private MyThread myThread; public LoadBalancesServlet(){ } public void init(){
String str = null;
if (str == null && myThread == null) {
myThread = new MyThread();
myThread.start();
}
}
public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws ServletException, IOException{
}
public void destory(){
if (myThread != null && myThread.isInterrupted()) {
myThread.interrupt();
}
}
} /**
* 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
*/
class MyThread extends Thread {
public void run(){
while (!this.isInterrupted()) {// 线程未中断执行循环
try {
Thread.sleep(2000); //每隔2000ms执行一次
System.out.println("定时执行");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
然后需要配置到web.xml中:
题外话:我遇倒的一些意外情况,在servlet中需要调用一些service,service中包含一些dao,在起初测试的时候发现service会抱错NullException,后来看到网友的一句话:
因为你的servlet不是由spring管理的,所以spring就不能往servlet里注入对象,而你的action是spring管理的,所以可以注入成功。
所以最终我们通过spring 的上下文来获取相应的service。具体方法如下:
//获取当前上下文环境,spring容器
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
RegularTaskService regularTaskService = (RegularTaskService)wac.getBean("regularTaskService");
经测试,可以使用。
最新文章
- NOIp2014 解题报告
- 在c中保存状态
- 在网页中编辑报表的报表设计器Stimulsoft Reports Designer.Web报表控件
- bzoj 1054 移动玩具
- HTML5中的localStorage用法
- MySQL Online DDL 工具之pt-online-schema-change
- String、StringBuffer、StringBuilder
- 【POJ 1679 The Unique MST】最小生成树
- Prefabs实例化 ResourceMgr
- Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)
- ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述
- ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用
- BZOJ 4539: [Hnoi2016]树 [主席树 lca]
- MEF 基础简介 三
- CF1096E The Top Scorer
- Mac mysql sql_model引起的问题
- 转移动APP测试实践
- python 字符串占位符的使用
- SpringBoot入门之内嵌Tomcat配置
- vs2013 查找进行的过程中被停止
热门文章
- 数据同步canal客户端
- 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。
- SJA1000 CAN驱动程序演示实验
- 所做更改会影响共用模板Normal.dotm。是否保存此更改
- iOS开发之使用UIView-Positioning简化页面布局
- Python基础(list和tuple)可变集合和‘不可变’集合
- python 画圆
- Hadoop开发第2期---虚拟机中搭建Linux
- Java关键字 Finally执行与break, continue, return等关键字的关系
- Sqlserver_分组