2015-04-17 21 views
5

Tôi đang cố gắng truyền dữ liệu chuỗi thời gian bằng Springframework SimpMessagingTemplate (thực thi Stomp mặc định) để truyền phát tin nhắn đến chủ đề mà khách hàng SockJS đã đăng ký. Tuy nhiên, các tin nhắn được nhận không đúng thứ tự. Máy chủ là một chuỗi và tin nhắn được gửi theo thứ tự tăng dần theo dấu thời gian của chúng. Khách hàng bằng cách nào đó đã nhận được tin nhắn ra khỏi lệnh.SockJS nhận tin nhắn stomp từ websocket mùa xuân theo thứ tự

Tôi đang sử dụng phiên bản phát hành mới nhất của cả stompj và springframework (bản phát hành 4.1.6).

Trả lời

8

Tìm thấy nguyên nhân gốc rễ của vấn đề này. Các thư được gửi theo thứ tự "đúng" từ phối cảnh triển khai ứng dụng (tức là convertAndSend() được gọi trong một luồng hoặc ít nhất là chuỗi thời trang an toàn "). Tuy nhiên, ổ cắm web Springframework sử dụng việc thực thi reactor-tcp để xử lý các thông báo trên Vì vậy, các tin nhắn có thể được ghi vào các tcp socket theo thứ tự khác nhau mà chúng được đến Khi tôi cấu hình socket web để giới hạn 1 thread cho clientOutboundChannel, thứ tự được giữ nguyên. không phải trong SocketJS mà là giới hạn của thiết kế socket Spring hiện tại

+0

Làm cách nào bạn có thể định cấu hình ổ cắm web để giới hạn 1 luồng cho clientOutboundChannel? – Tobia

+0

Bạn có thể cung cấp một ví dụ không? – Tobia

4

Đây là vấn đề thiết kế socket mạng mùa xuân.Để nhận tin nhắn theo thứ tự hợp lệ, bạn phải đặt corePoolSize của máy khách websocket thành 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); 
    } 
} 
0

Tôi cũng gặp sự cố này. Tôi không muốn giới hạn kích thước hồ bơi thread của tôi thành 1 vì điều này sẽ gây ra phí trên ứng dụng của tôi. Thay vào đó, tôi đã sử dụng một số StripedExecutorService để xử lý các thư đến và ra khỏi ứng dụng của mình. Loại dịch vụ thực thi này đảm bảo xử lý các thông điệp có trật tự cho các tác vụ có cùng dải. Đối với tôi, tôi sử dụng ID phiên WebSocket làm sọc. Đăng ký người thực thi này thông qua ChannelRegistration.taskExecutor() trên kênh gửi đến, môi giới và gửi đi của bạn và điều này sẽ đảm bảo thông điệp được sắp xếp. Chọn sọc của bạn một cách khôn ngoan.

Các vấn đề liên quan