当前遇到一个需求:

需要在web应用启动的时候就启动一个线程定时的来做某项工作。

有两种解决方法:

1.增加一个监听器Listener来实现相关功能。

2.增加一个随项目启动的servlet来实现相关功能。

这里Listener和随项目启动的servlet都可以随着项目启动而启动,只是启动的时序有所不同:

接下来分别实现下:

1.Listener实现:看代码

  1. package com.web.cloudAgent.servlet;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. import javax.servlet.ServletContextEvent;
  7. import javax.servlet.ServletContextListener;
  8.  
  9. public class LoadBalanceListener implements ServletContextListener
  10. {
  11. private MyThread myThread;
  12. @Override
  13. public void contextDestroyed(ServletContextEvent arg0)
  14. {
  15. // TODO Auto-generated method stub
  16. if (myThread != null && myThread.isInterrupted()) {
  17. myThread.interrupt();
  18. }
  19. }
  20.  
  21. @Override
  22. public void contextInitialized(ServletContextEvent arg0)
  23. {
  24. // TODO Auto-generated method stub
  25. String str = null;
  26. if (str == null && myThread == null) {
  27. myThread = new MyThread();
  28. myThread.start();
  29. }
  30. }
  31. }
  32. /**
  33. * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
  34. */
  35. class MyThread extends Thread {
  36. public void run(){
  37. while (!this.isInterrupted()) {// 线程未中断执行循环 
  38. try {
  39. Thread.sleep(2000); //每隔2000ms执行一次 
  40. System.out.println("定时执行");
  41. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
  42. System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
  43. } catch (InterruptedException e) {
  44. e.printStackTrace();
  45. }
  46.  
  47. }
  48. }
  49. }

然后需要将Listener配置到web.xml中:

<listener>
<listener-class>com.web.cloudAgent.servlet.LoadBalanceServlet</listener-class>
</listener>

2.servlet实现:

  1. package com.web.cloudAgent.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6.  
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class LoadBalancesServlet extends HttpServlet
  13. {
  14. private static final long serialVersionUID = 1L;
  15. private MyThread myThread;
  16.  
  17. public LoadBalancesServlet(){
  18.  
  19. }
  20.  
  21. public void init(){
  22. String str = null;
  23. if (str == null && myThread == null) {
  24. myThread = new MyThread();
  25. myThread.start();
  26. }
  27. }
  28. public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
  29. throws ServletException, IOException{
  30. }
  31. public void destory(){
  32. if (myThread != null && myThread.isInterrupted()) {
  33. myThread.interrupt();
  34. }
  35. }
  36. }
  37.  
  38. /**
  39. * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
  40. */
  41. class MyThread extends Thread {
  42. public void run(){
  43. while (!this.isInterrupted()) {// 线程未中断执行循环 
  44. try {
  45. Thread.sleep(2000); //每隔2000ms执行一次 
  46. System.out.println("定时执行");
  47. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
  48. System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
  49. } catch (InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52.  
  53. }
  54. }
  55. }

然后需要配置到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. QT 用listveiw显示图片

    很多的时候需要浏览图片,一般会使用listview 显示图片,接下来我用listview显示图片 代码如下: QStandardItem * s1; QStandardItem * s2; QStan ...

  2. Python3入门(五)——高级特性

    一.切片 对于取指定索引的值,python提供了切片来简化傻傻的循环 list2 = ["apple", "water", "banana" ...

  3. Android应用安全之第三方SDK安全

    第三方sdk的包括广告.支付.统计.社交.推送,地图等类别,是广告商.支付公司.社交.推送平台,地图服务商等第三方服务公司为了便于应用开发人员使用其提供的服务而开发的工具包,封装了一些复杂的逻辑实现以 ...

  4. 20155302 Exp2 后门原理与实践

    20155302<网络对抗>后门原理与实践 实验要求 1.使用netcat获取主机操作Shell,cron启动 (0.5分) 2.使用socat获取主机操作Shell, 任务计划启动 (0 ...

  5. 20155307《网络对抗》MSF基础应用

    实验过程 实验系统 所需设备: 靶机1:Windows XP Professional SP2 ,IP地址:192.168.1.128 靶机2:Windows XP Professional SP3 ...

  6. 20155320 Exp3 免杀原理与实践

    20155320 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. [基础问题回答] (1)杀软是如何检测出恶意代码的? 1.通过行为检 ...

  7. C# event线程安全

    突然想到有关C#中使用event特性时关于线程安全的问题,以前虽然有遵从“复制引用+null判断”的模式(盲目地),但没有深入了解和思考. 为之查询了资料和实验,对此有了进一步的理解. 一般event ...

  8. android全屏

    this.requestWindowFeature( Window.FEATURE_NO_TITLE ); this.getWindow().setFlags(WindowManager.Layout ...

  9. 在 JS 对象中使用 . 和 [] 操作属性的区别

    在 JS 对象中,调用属性一般有两种方法--点和中括号的方法. 例如 使用点方法 var obj = { name: "cedric" } console.log(obj.name ...

  10. wireshark找不到网卡

    在Capture Opinions中的interface若找不到网卡,一般是npf服务没有启动. npf是什么东东 Netgroup Packet Filter 网络数据包过滤器 NPF Device ...