如何防止服务在 Catalina 启动之前才启动

我有一个在 Apache Tomcat 9 上运行的 JAX-WS 客户端。该客户端通过进入无限循环来轮询数据,并设置为在启动时加载的 servlet。我遇到的问题是 servlet 在 Catalina 完成启动之前启动并进入循环。


我尝试使用 sleep() 和 wait() 无济于事,我尝试实现 org.apache.catalina.LifecycleListener 但这也不起作用。


这是我的 servlet 类:


@WebServlet("/MyClient")

public class MyServlet extends HttpServlet {


    @Override

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    }


    @Override

    public void init() throws ServletException {

        System.out.println("Servlet Started");

        MyClient client = new MyClient();

        client.startClient();


    }

}

这是我的民意调查课程:


public class Polling {


    private static final int TWO_MINUTES = 120000;


    public void startPoll() throws IOException {

        for (;;) {

            //Do something

            try {

                Thread.sleep(TWO_MINUTES);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }


}

我期望在 XXXX 毫秒内看到 org.apache.catalina.startup.Catalina.start 服务器启动,然后我的程序打印“Servlet Started”,但是它首先启动 servlet,这使得 tomcat 挂起并阻止访问其他 Web 应用程序。


守着一只汪
浏览 98回答 1
1回答

慕森王

您不会看到服务器启动,因为您劫持了初始化线程并开始用它进行轮询。服务器将在您的 servlet 初始化后启动,但它永远不会完成初始化,因为您调用它startPoll()并且init()它永远不会返回。不要使用无限循环和手动 2 分钟睡眠的手工轮询,而是考虑调度,例如使用Quartz或至少一个ScheduledExecutorService,这是一个基于 Tomcat 的示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java