当前遇到一个需求:

需要在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应用启动而自启动的后台线程的更多相关文章

  1. Web应用启动时,后台自动启动一个线程(转)

    原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html Web应用启动时,后台自动启动一个线程 (1)前言 前几天,manager问道一个问题: ...

  2. Web应用启动时,后台自动启动一个线程

    (1)前言 前几天,manager问道一个问题:能不能实现类似于cron的后台管理方式.问题解决后,想对这几个问题进行一下简单的总结.以便抛砖引玉!首先简单的提及一下cron. Cron,计划任务,是 ...

  3. Java Web应用启动间隔执行的程序

    Reference:<Java定时器timer.schedule在Web中间隔执行任务和定时><[Java]Timer和TimerTask详解> 做了一个Demo,完成如下的功 ...

  4. JavaWeb 服务启动时,在后台启动加载一个线程

    JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...

  5. 一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面

    SpringBoot springboot的目的是为了简化spring应用的开发搭建以及开发过程.内部使用了特殊的处理,使得开发人员不需要进行额外繁锁的xml文件配置的编写,其内部包含很多模块的配置只 ...

  6. Spring Boot移除内嵌Tomcat,使用非web方式启动

    前言:当我们使用Spring Boot编写了一个批处理应用程序,该程序只是用于后台跑批数据,此时不需要内嵌的tomcat,简化启动方式使用非web方式启动项目,步骤如下: 1.在pom.xml文件中去 ...

  7. 转载:如何让spring mvc web应用启动时就执行

    转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...

  8. WEB容器启动——web.xml加载详解

    最近在看spring的源码,关于web.xml文件在容器(Tomcat.JBOSS等)启动时加载顺序问题很混乱,通过搜集资料,得出以下的结论: 1.加载顺序与它们在 web.xml 文件中的先后顺序无 ...

  9. 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问 ...

随机推荐

  1. Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs

    在部署工程时,没有加入javax.servlet-api.jar(3.0.1) 和 standard.jar(1.1.2)两个jar包导致此问题. 另外,如果原来容器中有javax.servlet-a ...

  2. logistic回归梯度上升优化算法

    # Author Qian Chenglong from numpy import * from numpy.ma import arange def loadDataSet(): dataMat = ...

  3. TIOBE 11月编程语言榜:Go逆袭,Python势头很猛!

    导读 离 TIOBE 宣布 2018 年的编程语言只有2个月了.目前来看,有 5 个候选对象,它们都是来自前五名的:Java.C.C++.Python.Visual Basic.NET.每年我们都希望 ...

  4. asp.net mvc session锁问题 (转载)

    一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...

  5. HUE配置hadoop

    HDFS配置 参考文档:http://archive.cloudera.com/cdh5/cdh/5/hue-3.9.0-cdh5.5.0/manual.html Hadoop配置文件修改 hdfs- ...

  6. 20155229《网络对抗技术》Exp9:Web安全基础

    实验内容 Webgoat实践下相关实验. 实验步骤 WebGoat: Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本 ...

  7. 20155308『网络对抗技术』Exp7:网络欺诈防范

    20155308『网络对抗技术』Exp7:网络欺诈防范 原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET ...

  8. POJ 1789&&2485&&1258&&3026

    这个真的太水了——MST专辑. 如果不会MST的两种算法的同学可以出门右转了. 大致讲一下,第一题我是用Prim+堆优化的(毕竟点比较多),后面三题用的是Kruskal(习惯打,而且并查集常数实在小) ...

  9. 查询表的DDL

    例如: SQL>create table tab001(id varchar(4)); SQL>select dbms_metadata.get_ddl(‘TABLE’,’tab001’) ...

  10. vim打开多窗口、多文件之间的切换

    打开多个文件: 一.vim还没有启动的时候: 1.在终端里输入  vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :e file 可以再打开一 ...