Java 跨多个服务器的Tomcat WebSocket 当前解决方案
我有一个Java服务器(Tomcat)设置问题,希望有人能提供一些指导。目前,我的web应用程序是一个单一服务器,在Tomcat8.5上运行Java后端。为了处理Websocket连接,我保留了在Java 跨多个服务器的Tomcat WebSocket 当前解决方案,java,websocket,tomcat8,tomcat8.5,Java,Websocket,Tomcat8,Tomcat8.5,我有一个Java服务器(Tomcat)设置问题,希望有人能提供一些指导。目前,我的web应用程序是一个单一服务器,在Tomcat8.5上运行Java后端。为了处理Websocket连接,我保留了在onOpen()方法中传递的所有javax.Websocket.Session的Map @ServerEndpoint("/status") public class StatusMessenger { private static ConcurrentHashMap&
onOpen()
方法中传递的所有javax.Websocket.Session
的Map
@ServerEndpoint("/status")
public class StatusMessenger
{
private static ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap();
@OnOpen
public void onOpen(Session session) throws Exception
{
String sessionId = session.getRequestParameterMap().get("sessionId").get(0);
sessions.put(session.getId(), session);
}
javax.websocket.Session
的静态Map
——它不是无状态的,每个服务器上都有不同的Map
,每个服务器都有自己的javax.websocket.Session
列表
在我的应用程序中,服务器代码在某些情况下需要向所有用户广播一条消息。这些事件可能发生在此多服务器设置中的任何服务器上。该事件将触发broadcast()
方法,该方法在javax.websocket.Session
s中循环。但是,它将只在自己的映射中循环会话
如何让多服务器应用程序将此消息广播到安装程序中所有服务器上存储的所有websocket连接?该应用程序在单个服务器上运行良好(显然),因为只有一个websocket会话列表。换句话说,我该如何编写一个无状态应用程序来存储websocket连接,以便以后可以与它们通信?我找到了两种解决方案
在我的负载平衡器中,我设置了一条规则,将所有路径与/{my websocket server path}一起路由到1台服务器,以便所有会话都在同一台服务器上
使用第三方web推送库,如Pusher()
我找到了两种解决方案
在我的负载平衡器中,我设置了一条规则,将所有路径与/{my websocket server path}一起路由到1台服务器,以便所有会话都在同一台服务器上
使用第三方web推送库,如Pusher()
public static void broadcast(String event, String message)
{
for (Session session: sessions.values())
{
// send the message
}
}