有部分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>
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定时执行任务》( 点击打开链接)一模一样,不再赘述。