当前位置: 首页 > 知识库问答 >
问题:

Spring websocket从多线程发送消息

季俭
2023-03-14

我是如何临时修复它的:考虑我已经实现了下面的方法

void sendMessageToSession(WebsocketSession session,String message);

它向websocket会话发送一个TextMessage。我无法使整个方法同步,因为多个线程可以为不同的websocketSessions和消息调用它。我也不能将会话放在同步块中(尝试了但没有工作)

虽然,我这样解决了我的问题

synchronized(session.getId()){ 
    //sending message;
}
session = new ConcurrentWebSocketSessionDecorator(session, (int) StaticConfig.MAXIMUM_WS_ASYNC_SEND_TIMEOUT, StaticConfig.MAXIMUM_WS_BINARY_BUFFER_SIZE * 2);

共有1个答案

束敏学
2023-03-14

通过在我的WebSocketSession后面添加volatile关键字,我解决了这个问题。我很高兴知道这是否也是一个坏的做法。但我的想法是,当从多个线程写入websocket会话时,这些线程会释放websocket的状态,因为它还没有更新,这就是抛出这个异常的原因。

通过添加volatile,我们可以确保websocket状态在另一个线程使用它之前已经更新,这样写入websocket的工作就会像预期的那样同步。

我创建了一个名为SessionData的类,它保存websocketSession和我需要的关于Session的所有其他数据。

public class SessionData {
    private volatile WebSocketSession websocketSession;
    //...other 
    // getters and setters ...
}

这里的一个关键注意事项是,每次要向会话发送消息时,都应该使用sessionData.getWebSocketSession.SendMessage(...)。您不应该直接使用会话,这意味着像这样的代码是一种糟糕的做法:

WebSocketSession websocketSession = sessionData.getWebSocketSession();
websocketSession.sendMessage(...);

您永远不会知道在这两行代码(在您的例子中可能超过2行)之间对websocket会话应用了哪些更改。

此外,永远不要直接发布到Spring websocketMessageHandler中传递给您的会话中。否则,您可能会再次出现该错误。

 类似资料:
  • 我正在为android中的knx模块开发一个串口应用程序。我可以向knx modulde发送和接收赞扬。当从serialport接收到消息时,我想更改ui(例如按钮属性)。我用处理程序试过了,但我无法更改ui。帮我一把。 @覆盖公共空OnSerialsData(最终字节[]缓冲区,最终int大小){......} 它是我的串行端口侦听器函数,调用insine ReadThread。此线程从我的活动

  • 我正在Python3.6中使用Discord.py库开发一个Discord bot,在试图从创建的线程向特定通道发送消息时遇到了问题。 基本上,我有一些线程监视网站,我想调用一个函数(我正在传递给线程),当我注意到网站上的变化时,它会向一个特定的通道发送消息。 我最初尝试直接调用,而不使用Async/await,但它根本不起作用,所以我编写了Async/await函数发送消息(测试了它,它起作用了

  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 我正在使用kafka-producer并将数据发送到kafka-cluster(由三个代理组成)中由replication-factor 3和partitions 1组成的主题'test-topic'。 我创造了五条线。每个线程发送了10,000条消息(每个消息大小为4000字节)。 我预计最新抵销50,000,但实际上是44,993. 约有5,000条信息丢失。 为什么会出现消息丢失?在我的代码

  • 我试图使用Netty 4.0.8创建一个相当简单的WebSocket服务器。我有基本的握手设置和工作。但是从一个单独的线程发送的消息似乎没有传到客户端。 客户机/服务器交互的工作方式是,客户机启动连接,然后通过WebSocket发送初始消息(“hello”)。服务器立即响应。此消息通过Chrome开发工具传递并可见。写入此消息后,我将存储在中。此初始化如下: 然后添加,如下所示: 在单独的线程(在

  • 我正在尝试使用Springframework SimpMessageTemplate(默认Stomp实现)来流式传输时间序列数据,以将消息广播到SockJS客户端订阅的主题。但是,这些消息是按顺序接收的。服务器是单线程的,消息按时间戳升序发送。客户端以某种方式接收到了顺序错误的消息。 我使用的是stompjs和springframework的最新版本(4.1.6版本)。