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