为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2023-08-04 16:35:44
我有一个在 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 应用程序。
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

您不会看到服务器启动,因为您劫持了初始化线程并开始用它进行轮询。服务器将在您的 servlet 初始化后启动,但它永远不会完成初始化,因为您调用它startPoll()并且init()它永远不会返回。

不要使用无限循环和手动 2 分钟睡眠的手工轮询,而是考虑调度,例如使用Quartz或至少一个ScheduledExecutorService,这是一个基于 Tomcat 的示例。


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信