(一)关于ServletContextListener
在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法,只要定义类实现方法即可。
核心方法使用代码如下:
/**
* 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
* 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
*/
contextInitialized(ServletContextEvent sce)
/**
* 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
*/
contextDestroyed(ServletContextEvent sce)
(二)实现定时任务(使用Timer)
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。注意,Timer不能初始化两次,一个对象放一个Timer,否则会报初始化错误。下边看例子代码:
(1)继承ServletContextListener类实现ServletContextEvent 处理的两个方法。创建InvoiceListener 。
package com.css.listener;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.css.thirdparty.pool.SuNingGetInvoiceThreadPool;
import com.css.util.CheckSuNingInvoiceTimerBean;
import com.css.util.CheckSuNingReturnOrderInvoiceTimerBean;
public class InvoiceListener implements ServletContextListener{
private Timer checkSuNingInvoiceTimer = null;//提取开票成功的任务
private Timer checkSuNingReturnOrderInvoiceTimer = null;//提取退货的任务
public void contextDestroyed(ServletContextEvent arg0) {
checkSuNingInvoiceTimer.cancel();
checkSuNingReturnOrderInvoiceTimer.cancel();
}
public void contextInitialized(ServletContextEvent arg0) {
//(2)定时任务,隔一段时间执行的。
checkSuNingInvoiceTimer = new Timer();
checkSuNingInvoiceTimer.schedule(new CheckSuNingInvoiceTimerBean(), 0, 2*60*1000);//2分钟一次
//checkSuNingInvoiceTimer.schedule(new CheckSuNingInvoice