Tomcat启动时自动运行某程序

项目需要和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的优先级越高。

猜你喜欢

转载自www.cnblogs.com/taoHongFei/p/9327820.html