如何防止服务在 Catalina 启动后才启动
How to prevent service from starting until after Catalina has started
我有一个 JAX-WS 客户端,我是 Apache 上的 运行 Tomcat 9. 客户端通过进入无限循环来轮询数据,并设置为在启动时加载的 servlet .我遇到的问题是 servlet 在 Catalina 完成启动之前启动并进入循环。
我试过使用 sleep() 和 wait() 无济于事,我试过实施 org.apache.catalina.LifecycleListener 但这也没有用。
这是我的 servlet class:
@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();
}
}
这是我的投票 class:
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();
}
}
}
}
我希望在我的程序打印 "Servlet Started" 之前看到 org.apache.catalina.startup.Catalina.start 服务器在 XXXX 毫秒内启动,但是它首先启动 servlet,这使得 tomcat 挂起并阻止访问其他网站应用程序。
您不会看到服务器启动,因为您劫持了初始化线程并开始对其进行轮询。服务器将在您的 servlet 初始化后启动,但它永远不会完成初始化,因为您在 init()
中调用 startPoll()
并且它永远不会 returns.
与其使用无限循环和手动 2 分钟睡眠的手工轮询,不如查看调度,例如使用 Quartz or at least a ScheduledExecutorService, here's a Tomcat based example。
我有一个 JAX-WS 客户端,我是 Apache 上的 运行 Tomcat 9. 客户端通过进入无限循环来轮询数据,并设置为在启动时加载的 servlet .我遇到的问题是 servlet 在 Catalina 完成启动之前启动并进入循环。
我试过使用 sleep() 和 wait() 无济于事,我试过实施 org.apache.catalina.LifecycleListener 但这也没有用。
这是我的 servlet class:
@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();
}
}
这是我的投票 class:
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();
}
}
}
}
我希望在我的程序打印 "Servlet Started" 之前看到 org.apache.catalina.startup.Catalina.start 服务器在 XXXX 毫秒内启动,但是它首先启动 servlet,这使得 tomcat 挂起并阻止访问其他网站应用程序。
您不会看到服务器启动,因为您劫持了初始化线程并开始对其进行轮询。服务器将在您的 servlet 初始化后启动,但它永远不会完成初始化,因为您在 init()
中调用 startPoll()
并且它永远不会 returns.
与其使用无限循环和手动 2 分钟睡眠的手工轮询,不如查看调度,例如使用 Quartz or at least a ScheduledExecutorService, here's a Tomcat based example。