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

SockJS从SpringWebSocket接收stomp消息时出错

季博
2023-03-14

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

我使用的是stompjs和springframework的最新版本(4.1.6版本)。

共有3个答案

宋伟泽
2023-03-14

看起来有一个内置的条纹执行器,所以只需启用它:

@Override
protected void configureMessageBroker(MessageBrokerRegistry registry) {
    // ...
    registry.setPreservePublishOrder(true);
}

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-ordered-messages

冯野
2023-03-14

这是SpringWeb套接字的设计问题。要按有效顺序接收消息,必须将websocket客户端的corePoolSize设置为1。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketMessageBrokerConfiguration extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
        registration.taskExecutor().corePoolSize(1);
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.taskExecutor().corePoolSize(1);
    }
}
郝杰
2023-03-14

找到了此问题的根本原因。从应用程序实现的角度来看,消息以“正确”的顺序发送(即convertAndSend()以一个线程或至少线程安全的方式调用))但是,Springframework web套接字使用reactor tcp实现,该实现将处理来自线程池的clientOutboundChannel上的消息。因此,消息可以按照到达的不同顺序写入tcp套接字。当我将web套接字配置为clientOutboundChannel限制1个线程时,该顺序将保留。

这个问题不在SocketJS中,而是当前Spring Web套接字设计的一个限制。

 类似资料:
  • 一、STOMP协议介绍 STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。 STOMP协议的前身是TTMP协

  • 我有一个问题——我有一个带有websocket的java spring web应用程序,在本教程之后是sockjs实现https://spring.io/guides/gs/messaging-stomp-websocket/我需要用NodeJS连接到这个服务器应用程序。服务器应用程序是正常的,因为我设法通过web应用程序连接,它正在工作,但问题来了,当我试图实现它的nodejs。因此,要明确这一

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

  • 我使用jax-ws 2.2.7来生成web服务。操作签名是: TKS!!!

  • 我试图从一些门户网站获取交易状态,我在我的java应用程序中使用下面的chrome设置 从渲染器接收消息时超时:60.000 所有悬而未决的交易都在超时。 会话信息:headless chrome=68.0.3440.75 驱动程序信息:chromedriver=2.38(0) 平台=Linux 2.6.32-696.23.1。el6。x86_64 x86_64) 我如何处理这个问题,如果发生任何

  • 问题内容: 我正在尝试从某个门户网站获取交易状态,并且在我的Java应用程序中使用了以下chrome设置, 超时从渲染器接收消息:60.000 并且所有待处理的交易都已超时。 会话信息:headless chrome = 68.0.3440.75 驱动程序信息: chromedriver = 2.38 (0) 平台= Linux 2.6.32-696.23.1.el6.x86_64 x86_64)