随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");
经测试,可以使用。
随web应用启动而自启动的后台线程的更多相关文章
- Web应用启动时,后台自动启动一个线程(转)
原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html Web应用启动时,后台自动启动一个线程 (1)前言 前几天,manager问道一个问题: ...
- Web应用启动时,后台自动启动一个线程
(1)前言 前几天,manager问道一个问题:能不能实现类似于cron的后台管理方式.问题解决后,想对这几个问题进行一下简单的总结.以便抛砖引玉!首先简单的提及一下cron. Cron,计划任务,是 ...
- Java Web应用启动间隔执行的程序
Reference:<Java定时器timer.schedule在Web中间隔执行任务和定时><[Java]Timer和TimerTask详解> 做了一个Demo,完成如下的功 ...
- JavaWeb 服务启动时,在后台启动加载一个线程
JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...
- 一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面
SpringBoot springboot的目的是为了简化spring应用的开发搭建以及开发过程.内部使用了特殊的处理,使得开发人员不需要进行额外繁锁的xml文件配置的编写,其内部包含很多模块的配置只 ...
- Spring Boot移除内嵌Tomcat,使用非web方式启动
前言:当我们使用Spring Boot编写了一个批处理应用程序,该程序只是用于后台跑批数据,此时不需要内嵌的tomcat,简化启动方式使用非web方式启动项目,步骤如下: 1.在pom.xml文件中去 ...
- 转载:如何让spring mvc web应用启动时就执行
转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...
- WEB容器启动——web.xml加载详解
最近在看spring的源码,关于web.xml文件在容器(Tomcat.JBOSS等)启动时加载顺序问题很混乱,通过搜集资料,得出以下的结论: 1.加载顺序与它们在 web.xml 文件中的先后顺序无 ...
- Request Entity Too Large for Self Hosted ASP.Net Web API在Selfhost的api后台怎么解决Request Entity Too Large问题
Request Entity Too Large for Self Hosted ASP.Net Web API在Selfhost的api后台怎么解决Request Entity Too Large问 ...
随机推荐
- 关于Altium Designer 提示发送错误报告解决方法
提示是这样子,,,,,, 稍微有点问题就提示,,,复制也提示,,,,移动也提示,,,,,,算是服了这个软件了.......真是忍无可忍,那就无需再忍,解决掉 以前是安装上一个虚拟的打印机就好了,,,其 ...
- Android开发环境的发展以及重装系统之后在myeclipse重配Android开发环境。
android的开发环境早期要自己去去官网下SDK,ADT,AVD等.不仅在一开始要面临国内防火墙的阻拦,四处奔波之后都下载好了,还得自己Linked,可谓困难重重.随着android开发的火热,上面 ...
- php连接mysql...mysqli和mysql
mysql_connect()这一系列函数已经不推荐使用了,不安全. <?php $con = mysql_connect('localhost','root','');// 选择连接数据库系统 ...
- 半导体热阻问题深度解析(Tc,Ta,Tj,Pc)
半导体热阻问题深度解析(Tc,Ta,Tj,Pc) 本文是将我以前的<有关热阻问题>的文章重新梳理,按更严密的逻辑来讲解. 晶体管(或半导体)的热阻与温度.功耗之间的关系为: Ta=Tj-* ...
- tomcat-在cmd窗口启动Tomcat
平时,一般使用tomcat/bin/startup.bat目录在windows环境启动Tomcat,或者使用IDE配置后启动. 下面来简单介绍下如果在cmd窗口直接输入命令启动Tomcat: 1.将t ...
- 使用 restTemplate 实现get/post 请求
get 请求(这里是在 idea 的 test包中,所以需要直接 new RestTemplate() ) 即:RestTemplate restTemplate = new RestTemplate ...
- [UOJ#276][清华集训2016]汽水[分数规划+点分治]
题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...
- 委托、多播委托(MulticastDelegate)
委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...
- centos7 部署LNMP
1.安装Nginx 使用Nginx官方提供的rpm包 [root@nginx ~]# cat /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo b ...
- Azkaban集群部署
一.部署模式 solo-server模式 (使用内置h2存储元数据): two-server模式 (1个webServer,1个execServer在同一服务器上,使用mysql存储元数据): mu ...