原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html

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

(1)前言

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

Cron,计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比如我们可以在配置文件中约定每天早上4点,对http服务器重新启动,这就是一个计划任务。

在java应用中一种类似的模式就是应用启动时后台线程的运行,定时的触发某些任务的运行。目前,这种自启动的后台线程,有两种常见的模式:一种是listener,一种是servlet

(2)listener

listener方式是比较常用的。实际上,servelet API 提供了大量监听器来监听web应用的内部事件,从而允许当web应用内部事件发生时而回调监听器的方法,常见的事件有:web应用被启动、web应用被停止、用session开始、用户session结束、用户请求到达等。

其中ServletContextListener用于web应用的启动和关闭。对于我们刚刚提及的需求,我们需要在web应用启动的时候就开始启动后台的服务线程。

ServletContextListener有两个常用的方法:

    void contextInitialized(ServletContextEvent sce)

这个方法在Container初始化整个Web应用时调用,运行在该Web应用中servlet和filter初始化之前

void contextDestroyed(ServletContextEvent sce)

这个方法在Container卸载整个Web应用时调用,运行在该Web应用中servlet和filter的destroy()方法之后

例子:

首先定义一个后台的服务线程

public class run implements Runnable{

@Override
 public void run() {
  while(true){
   try {
       Thread.sleep(5000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
    System.out.println("you mother call you to go home to eat......")
  }

}

}

定义一个listener类

package com.cims; 
 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
 
 
public class MyListener implements ServletContextListener {  
    public void contextDestroyed(ServletContextEvent e) {   
    } 
 
    public void contextInitialized(ServletContextEvent e) {  
            System.out.println("------------web start-------");

new Thread(new run()).start();



最后需要在web.xml进行一下配置:


启动项目,你就会发现你妈妈喊你回家吃饭。。。。

(3)servlet

无意中,尽然惊讶地发现servlet也有这样的功能,这得益于load-on-startup 属性,后面将对该属性进行一些简单解析。

服务线程仍然保持不变,写一个servlet(集成HttpServlet)

package com.cims;  
import java.io.IOException; 
import javax.servlet.*; 
import javax.servlet.http.*;  
 
public class MyServlet extends HttpServlet{ 
 
    private static final long serialVersionUID = 1L;  
    public MyServlet(){ 
    }  
    public void init(){

new Thread(new run()).start();
    }  
    public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) 
        throws ServletException, IOException{ 
    } 
 
    public void destory(){  
    } 
    } 
}

最后需要在web.xml进行一下配置:


启动项目,你同样会发现你妈妈喊你回家吃饭。。。。
1.load-on-startup解析

    1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

4)当值小于0或者没有指定时,可以由server容器自行决定何时load该servlet。

5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6)当值相同时,容器就会自己选择顺序来加载。   

2.两种回家吃饭方式不同

    web应用的启动好比你正在start的一个游戏,listener好比在你start之前你妈妈就喊你回家吃饭了;servlet方式好比你已经start了,准备打boss时,你妈妈喊你回家吃饭。原因在于ServletContextListener的contextInitialized方法运行在servlet之前。

下面来看一后台启动的打印截图,你就会发现!

    第一种方式:


     也就是说listener在web应用起来之前已经开始start了
第二种方式:

servlet必须在web应用完全启动完毕之后才开始运行了!

Web应用启动时,后台自动启动一个线程(转)的更多相关文章

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

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

  2. springmvc怎么在启动时自己执行一个线程

    之前使用springmvc的时候,都是写好controller和对应的数据库操作. 外界发请求的时候,controller进行一堆操作后返回相应的json数据. 似乎springmvc就是外界驱动的一 ...

  3. spring mvc web应用启动时就执行特定处理(线程启动)

    package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...

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

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

  5. Java web 服务启动时Xss溢出异常处理笔记

    本文来自网易云社区 作者:王飞 错误日志 错误日志要仔细看,第一行不一定就是关键点,这个错误出现的时候,比较靠后,其中关键行就是下面这句. Caused by: java.lang.IllegalSt ...

  6. 在web项目启动时,使用监听器来执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 这里写了个简 ...

  7. 在web项目启动时,执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  8. 基于spring的web项目启动时预加载数据到ServletContext

    1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...

  9. Spring在Web容器启动时执行初始化方法

    需求:在tomcat启动时开启一个定时任务. 想法:容器启动时执行方法,最容易想到的就是servlet中可以配置load-on-startup,设置一个正整数也就可以随容器一起启动. 问题:上面的方法 ...

随机推荐

  1. Vim使用心得

    马上就要联赛啦. 学习一下vim 这是一个vim文档 http://vimcdoc.sourceforge.net/doc/ 这是一个优秀的vimrc配置 http://www.cnblogs.com ...

  2. Note of Jieba ( 词云图实例 )

    Note of Jieba jieba库是python 一个重要的第三方中文分词函数库,但需要用户自行安装. 一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容 ...

  3. pymongo使用手册

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...

  4. JSMDN常用函数总结

    /* 2018/08/25 更新日志:增加 六:条件操作符判断 2018/09/04 更新日志:增加 六.5.三元运算,六.1.注意下 ,七.eval函数使用示例*/一.数组Array常用方法1. 使 ...

  5. 基于.net的微服务架构下的开发测试环境运维实践

    眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两年多的实践,发现完全 ...

  6. 小甲鱼Python第十九讲课后习题

    笔记: 1.内嵌函数:函数内部新创建另一个函数 2.闭包:函数式编程的重要语法,如果在一个内部函数里,对外部作用域(但不是在全局作用域的变量)进行引用,那么内部函数就会被认为是闭包. 3.nonloc ...

  7. HBase scan 时 异常 ScannerTimeoutException 解决

    org.apache.Hadoop.hbase.client.ScannerTimeoutException: 60622ms passed since the last invocation, ti ...

  8. 日期求星期(java)-蓝桥杯

    日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...

  9. yum安装mysql5.7

    [root@ycj ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm //下载安装 ...

  10. ApiShell

    using System; using System.Runtime.InteropServices; using HWND = System.IntPtr; using HANDLE = Syste ...