随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问 ...
随机推荐
- shiro实战系列(二)之入门实战续
下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...
- vue之常用指令
事件缩写 v-on:click= 简写方式 @click= 事件对象$event <!DOCTYPE html> <html lang="en"> < ...
- Ubuntu系统上All-in-one部署OpenStack
虚拟机软件:VMware Workstaion12 操作系统:Ubuntu14.04 1.修改Ubuntu14.04的apt源为国内的阿里源: cp /etc/apt/sources.list /et ...
- Bat 批处理杀死进程 重新启动程序
@echo offset pa=%cd%taskkill /F /IM wgscdTool.exeecho %pa%\wgscdTool.exeping /n 2 127.1>nulstart ...
- 20155311《网络对抗》Web安全基础实践
20155311<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...
- LOJ #2135. 「ZJOI2015」幻想乡战略游戏
#2135. 「ZJOI2015」幻想乡战略游戏 链接 分析: 动态点分治,求加权重心,带修改. 考虑如果知道了一个点s,如何求答案,那么首先可以点分治的思想,求每个联通块内所有点到分治中心距离和,然 ...
- 软件测试 —— Bug
[Bug规范] Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题尽量简明 做什么操作 + 出现什么结果,比如(点击提交按钮,出现卡顿现象 ...
- java Script复习总结
一:基础知识 1.JavaScript语言的历史 l 早期名称:livescript l 开发公司:网景公司(netscape) 2.JavaScript语言的基本特点 l 基于对象 l 事件 ...
- 【Unity Shader】从NDC(归一化的设备坐标)坐标转换到世界坐标的数学原理
从NDC(归一化的设备坐标)坐标转换到世界坐标要点 参考资料 How to go from device coordinates back to worldspace http://feepingcr ...
- Unity 角色场景传送功能
传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine. ...