1. 程式人生 > >Tomcat啟動時自動運行某程序

Tomcat啟動時自動運行某程序

指示 timertask 接口 throw time test ref 自定義 pre

項目需要和tmall實現長連接,接收tmall推送的Order消息,然後對消息進行邏輯處理。

目前寫了一個servlet,實現了permit的驗證,然後對tmall進行長連接操作,啟動後,只要tomcat一直運行著,長連接就不會斷掉。現在的需求是tomcat啟動後我這個servlet自己就運行起來,不用我自己再去訪問一下配置的servlet路徑。

資料:

http://www.cnblogs.com/Payne-Wang/archive/2013/04/01/loadOnTomcatStartup.html

https://blog.csdn.net/csnewdn/article/details/54618366

https://www.cnblogs.com/wdpnodecodes/p/8025134.html

有兩種方法實現需求

方法一:servlet裏面重寫init()方法

第一步:自定義一個servlet,重寫init()方法

public class GetMessageFromTBServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("開始了。。。。。");
        if ( MessageWork.getPermit())
        {
            
try { MessageWork.getMessageFromTaoBao(); } catch (Exception e) { e.printStackTrace(); } } }

技術分享圖片

第二步:配置web.xml 映射servlet地址,並添加啟動優先級

技術分享圖片

<load-on-startup>N</load-on-startup> 的含義是:標記容器是否在啟動的時候就加載這個servlet。當值為0或者大於0時,表示容器在應用啟動時就加載這個servlet;當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。正數的值越小,啟動該servlet的優先級越高。

方法二:servlet的Listener監聽器

第一步:自定義一個listener 實現javax.servlet.ServletContextListener接口,同時實現該接口的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個接口函數。

MessageListener 類

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Timer;

public class MessageListener implements ServletContextListener {
private Timer timer=null;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
timer=new Timer(true);
servletContextEvent.getServletContext().log("start");
timer.schedule(new MessageTask(servletContextEvent.getServletContext()),10*1000,5*1000);
}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {

}
}
 
MessageTask類

import Intermediate_system.message.MessageTest;

import javax.servlet.ServletContext;
import java.util.TimerTask;

public class MessageTask extends TimerTask {
    private static boolean isRunning=false;
    private ServletContext context=null;

    public MessageTask(ServletContext context){
        this.context=context;

    }
    @Override
    public void run() {
        if (!isRunning)
        {
            isRunning=true;
            //指定任務
            MessageTest.getPermit();
            isRunning=false;
        }else {
            context.log("任務還沒有結束");
        }

    }
}

第二步:web.xml裏面配置listener

技術分享圖片

servlert啟動優先級

<load-on-startup>1</load-on-startup> 標記容器在啟動時加載此servlet。當值為0或者大於0時,表示web容器在應用啟動時就加載這個servlet;
當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載; 正數的值越小,啟動該servlet的優先級越高。

技術分享圖片

Tomcat啟動時自動運行某程序