Web应用启动时,后台自动启动一个线程(转)
原文: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应用启动时,后台自动启动一个线程(转)的更多相关文章
- Web应用启动时,后台自动启动一个线程
(1)前言 前几天,manager问道一个问题:能不能实现类似于cron的后台管理方式.问题解决后,想对这几个问题进行一下简单的总结.以便抛砖引玉!首先简单的提及一下cron. Cron,计划任务,是 ...
- springmvc怎么在启动时自己执行一个线程
之前使用springmvc的时候,都是写好controller和对应的数据库操作. 外界发请求的时候,controller进行一堆操作后返回相应的json数据. 似乎springmvc就是外界驱动的一 ...
- spring mvc web应用启动时就执行特定处理(线程启动)
package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...
- 转载:如何让spring mvc web应用启动时就执行
转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...
- Java web 服务启动时Xss溢出异常处理笔记
本文来自网易云社区 作者:王飞 错误日志 错误日志要仔细看,第一行不一定就是关键点,这个错误出现的时候,比较靠后,其中关键行就是下面这句. Caused by: java.lang.IllegalSt ...
- 在web项目启动时,使用监听器来执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 这里写了个简 ...
- 在web项目启动时,执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...
- 基于spring的web项目启动时预加载数据到ServletContext
1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...
- Spring在Web容器启动时执行初始化方法
需求:在tomcat启动时开启一个定时任务. 想法:容器启动时执行方法,最容易想到的就是servlet中可以配置load-on-startup,设置一个正整数也就可以随容器一起启动. 问题:上面的方法 ...
随机推荐
- Linux下PHP扩展pdo_mysql
1.进入PHP源码包ext/pdo目录 cd ext/pdo 2.执行/usr/local/php/bin/phpize[假设PHP的安装目录为/usr/local/php] /usr/local/p ...
- __x__(21)0907第四天__ css 盒模型 (框模型)
CSS 处理元素,把每个元素都包含在一个盒子里. 对网页的布局,其实就是对盒子的摆放及设置. 边框border,会使盒子变大: .box{ border: 10px 20px 30px 40px r ...
- Spring Boot @EnableWebMvc 与 mvc 配置
注意: 1.小心使用 @EnableWebMvc 注解 根据官方文档,尽量不要使用 @EnableWebMvc 注解,因为它会关闭默认配置. ① 你希望关闭默认配置,自己完全重新实现一个 @Enab ...
- 黑盒测试实践——day03
一.任务进展情况 目前基本确定选取的测试工具是Testwriter,测试的web系统还在待定状态,小组成员都在网上搜集相关知识,学习相关的测试技术. 二.存在的问题 Testwriter ...
- 切换controller 后面的最好不要用id参数,不然会根据路由规则改变
//切换actionResult return RedirectToAction("Edit", "EngineeringCase", ...
- 微信小程序里如何用阿里云上传视频,图片。。
纯手写,踩了半天多的坑干出来了... 网上也有对于阿里云如何在微信小程序里使用,但是很不全,包括阿里云文档的最佳实践里. 话不多说上代码了. upvideo(){ var aliOssParams = ...
- reference to 'map' is ambiguous|
reference to 'map' is ambiguous| c++编译出现此错误 表明定义的变量名字map和库函数map冲突而产生歧义
- js 讲解
substring() 取文本中间 split() 分割文本 charcodeat() utf-8 tolowercase() 小写 正则是一个对象 正则 i 不区分大小写 escape(s ...
- 2018-2019-2 网络对抗技术 20165311 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165311 Exp3 免杀原理与实践 免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil- ...
- 【Python基础】lpthw - Exercise 41 学习面向对象术语
一.专有词汇 类(class):告诉python创建新类型的东西. 对象(object):两个意思,即最基本的东西,或者某样东西的实例. 实例(instance):让python创建一个类时得到的东西 ...