我有一個在 Apache Tomcat 9 上運行的 JAX-WS 客戶端。該客戶端通過進入無限循環(huán)來輪詢數(shù)據(jù),并設(shè)置為在啟動時加載的 servlet。我遇到的問題是 servlet 在 Catalina 完成啟動之前啟動并進入循環(huán)。我嘗試使用 sleep() 和 wait() 無濟于事,我嘗試實現(xiàn) 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(); }}這是我的民意調(diào)查課程: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 毫秒內(nèi)看到 org.apache.catalina.startup.Catalina.start 服務(wù)器啟動,然后我的程序打印“Servlet Started”,但是它首先啟動 servlet,這使得 tomcat 掛起并阻止訪問其他 Web 應(yīng)用程序。
1 回答

慕森王
TA貢獻1777條經(jīng)驗 獲得超3個贊
您不會看到服務(wù)器啟動,因為您劫持了初始化線程并開始用它進行輪詢。服務(wù)器將在您的 servlet 初始化后啟動,但它永遠不會完成初始化,因為您調(diào)用它startPoll()
并且init()
它永遠不會返回。
不要使用無限循環(huán)和手動 2 分鐘睡眠的手工輪詢,而是考慮調(diào)度,例如使用Quartz或至少一個ScheduledExecutorService,這是一個基于 Tomcat 的示例。
添加回答
舉報
0/150
提交
取消