zoukankan      html  css  js  c++  java
  • 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的优先级越高。


    Fighting!----THF

    知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得
  • 相关阅读:
    WeakHashMap回收时机结合JVM 虚拟机GC的一些理解
    java socket 模拟im 即时通讯
    记录 serverSocket socket 输入,输出流,关闭顺序,阻塞,PrintWriter的一些问题.
    Socket 参数笔记
    MongoDB的DBREF 使用.
    MongoDB,子查询
    MongoDB,分组,聚合
    在SAP Data Intelligence Modeler里创建新的pipeline
    SAP Data Intelligence Modeler里的Kafka Producer和Kafka Consumer
    从SAP Leonardo到SAP Data Intelligence
  • 原文地址:https://www.cnblogs.com/taoHongFei/p/9327820.html
Copyright © 2011-2022 走看看