【发布时间】:2021-02-05 18:52:48
【问题描述】:
当前解决方案
我有一个 Java 服务器 (Tomcat) 设置问题,希望有人能提供一些指导。目前,我的 Web 应用程序是一个在 Tomcat 8.5 上运行 Java 后端的单服务器。为了处理 Websocket 连接,我在 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);
}
我的应用程序只向所有用户广播消息,所以我的代码中的broadcast() 只是循环通过sessions.values() 并通过每个javax.websocket.Session 发送消息。
public static void broadcast(String event, String message)
{
for (Session session: sessions.values())
{
// send the message
}
}
- 我什至不确定这是在 Tomcat 中处理 Websocket 的正确方法,但它已经为我工作了多年,所以我认为它是可以接受的。
问题
我现在想将 AWS 上的应用程序横向扩展至多台服务器。在大多数情况下,我的应用程序是无状态的,我将常规 HTTP 会话信息存储在数据库中。我的问题是javax.websocket.Session 中的这个静态Map - 它不是无状态的,每台服务器上都有不同的Map,每个服务器都有自己的javax.websocket.Sessions 列表。
在我的应用程序中,服务器代码在某些情况下需要向所有用户广播一条消息。这些事件可能发生在此多服务器设置中的任何服务器上。该事件将触发循环通过javax.websocket.Sessions 的broadcast() 方法。但是,它只会循环遍历它自己的Map 中的会话。
如何让多服务器应用程序将此消息广播到存储在设置中所有服务器上的所有 websocket 连接?该应用程序在单服务器上运行良好(显然),因为只有 1 个 websocket 会话列表。换句话说,我如何编写一个需要存储 websocket 连接以便以后可以与它们通信的无状态应用程序?
【问题讨论】:
标签: java websocket tomcat8 tomcat8.5