我正在尝试使用Springframework SimpMessagingTemplate(默认的Stomp实现)流式传输时间序列数据,以将消息广播到SockJS客户端订阅的主题。但是,消息被乱序接收。服务器是单线程,并且消息按其时间戳按升序发送。客户端以某种方式接收到消息的顺序错误。
我正在使用stompjs和springframework的最新发行版(4.1.6发行版。)>
我正在尝试使用Springframework SimpMessagingTemplate(默认的Stomp实现)流式传输时间序列数据,以将消息广播到SockJS客户端订阅的主题。但是,...
找到了此问题的根本原因。从应用程序实现的角度来看,消息以“正确”的顺序发送(即,以一个线程或至少线程安全的方式调用convertAndSend()。)但是,Springframework Web套接字使用react-tcp实现,它将在以下位置处理消息:来自线程池的clientOutboundChannel。因此,可以按照到达消息的不同顺序将消息写入tcp套接字。当我将Web套接字配置为clientOutboundChannel限制1个线程时,将保留该顺序。
这个问题不在SocketJS中,而是当前Spring Web套接字设计的局限性。
这是Spring Web套接字设计问题。要以有效顺序接收消息,您必须将websocket客户端的corePoolSize设置为1。
似乎有一个内置的带区执行器,因此只需启用它:
UPDATE