现在的位置: 首页 > 综合 > 正文

【Servlet】利用load-on-startup创造一条随服务器共存亡的线程

2018年05月06日 ⁄ 综合 ⁄ 共 1829字 ⁄ 字号 评论关闭

有部分Javaee或者Javaweb的组件要求在web.xml部分配置些代码,如果你细心留意一下,就会发现其中大部分都有load-on-startup的参数。这个参数是用来配合那些仅有void init(ServletConfig config)的Servlet来创造一条随服务器共存亡的线程执行所需要的任务的。有些任务必须在服务器开始就开始,在服务器结束就结束,你可以考虑利用Servlet的load-on-startup来完成。比如一个网站要求时刻检查一些东西,比如微信接入要求每7200秒,2个小时就要向服务器反馈一些信息等等,你可以考虑是利用这个实现。

一、基本目标

创造一个Servlet,每1秒就向控制台输出当前时间,也就是Tomcat的控制台每1秒就会显示当前时间,这个动作与服务器共存亡。

二、制作过程

1、首先网站工程的目录结构如下图所示,没有任何页面,在src文件夹下面仅有一个等待被web.xml调用的SecondTimer.java,在lib文件夹放入javax.servlet-api-3.1.0.jar,以免有些低版本的Tomcat不遵循Servlet3.0规范,当然这个例子在低版本的Servlet也是没问题的,向下兼容的,怕是怕部分来路不明的Tomcat服务器不支持Servlet。javax.servlet-api-3.1.0.jar你在网上一搜一大堆,超过3.0就行,以免出现这样那样的问题。

2、web.xml如下所示,不像我在《【Servlet】最简单的Servlet JavaWeb程序》(点击打开链接)说过那些最简单的Servlet,根目录下的SecondTimer在服务器运行就马上被执行。load-on-startup的参数是优先级,越少越优先,最优先为0。意思是如果有多个这样的Servlet,那么比对哪个load-on-startup较少,哪个先执行。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<servlet>
		<servlet-name>timer</servlet-name>
		<servlet-class>SecondTimer</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
</web-app>

3、原本的Servlet是响应请求做完工作之后就会消失,但是通过load-on-startup启动的Servlet由于仅重写init方法,没有doPost,doGet方法,或者doPost,doGet的合并方法service,这个Servlet也没有映射地址,所以这个Servlet永远不会被销毁。

import java.util.*;
import java.text.SimpleDateFormat;

import javax.servlet.*;
import javax.servlet.http.*;

public class SecondTimer extends HttpServlet {
	public void init(ServletConfig config) throws ServletException {
		Timer timer = new Timer();
		timer.schedule(new MyTask(), 0, 1000);
	}

}

class MyTask extends TimerTask {
	public void run() {
		System.out.println(new SimpleDateFormat("yyyy年MM月dd日hh:mm:ss E")
				.format(new Date(System.currentTimeMillis())).toString());
	}
}

至于如何向控制台定时输出时间,原理与《【Java】利用Timer与TimerTask定时执行任务》(点击打开链接)一模一样,不再赘述。

抱歉!评论已关闭.