【发布时间】:2014-08-14 08:17:44
【问题描述】:
我有以下场景:具有相同应用程序的几个 Tomcat 实例需要在启动时相互连接。对于服务器之间的连接,使用 WebSockets (JSR-356)。 Tomcat启动后,我需要启动与另一台服务器的建立。
我怎样才能最正确地处理,内部 WebSockets 机制已经启动并且我可以开始使用 WebSockets?
应用基于 Spring 4。
我试过这个Execute method on startup in spring、这个How to add a hook to the application context initialization event?和这个Tomcat after Startup Event with spring。
所有这些方法都很酷,但似乎在那一刻 WebSockets 还没有准备好使用。 抛出下一个异常:
javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection failed
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:373)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:201)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:222)
...
Caused by: java.util.concurrent.TimeoutException
at sun.nio.ch.PendingFuture.get(PendingFuture.java:197)
at org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:599)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:343)
目前,作为一种解决方法,我在建立连接之前在 WebServlet 的 init() 方法中使用了 3 秒的延迟,但我想避免这种黑客行为。
有什么想法吗?谢谢!
【问题讨论】:
-
为什么选择 WebSockets?您需要等待连接器启动才能使用它们。一旦应用程序准备好,连接器就会出现。一旦启动钩子运行,应用程序就准备好了。哎呀。
-
如问题中所述,我尝试在应用程序上下文启动但没有运气时启动 websockets 连接。您能否更深入地描述如何处理该连接器已启动?
标签: java spring tomcat websocket jsr356