Вопрос:

SockJS получает сообщения о потопе из пружинной веб-розетки из строя

stomp sockjs spring-websocket

2089 просмотра

4 ответа

406 Репутация автора

Я пытаюсь выполнять потоковую передачу данных временных рядов с помощью Springframework SimpMessagingTemplate (реализация Stomp по умолчанию) для трансляции сообщений в тему, на которую подписан клиент SockJS. Однако сообщения получены не по порядку. Сервер является однопоточным, и сообщения отправляются в порядке возрастания по их временным меткам. Клиент каким-то образом получил сообщения из заказа.

Я использую последнюю версию как stompjs, так и springframework (выпуск 4.1.6).

Автор: Zhichao Источник Размещён: 17.04.2015 03:40

Ответы (4)


10 плюса

406 Репутация автора

Нашел основную причину этой проблемы. Сообщения отправлялись в «правильном» порядке с точки зрения реализации приложения (то есть, convertAndSend () вызывается в одном потоке или, по крайней мере, в поточно-ориентированном режиме »). Однако в веб-сокете Springframework используется реактор-tcp, который обрабатывает сообщения в clientOutboundChannel из пула потоков. Таким образом, сообщения могут быть записаны в сокет tcp в другом порядке их поступления. Когда я настроил веб-сокет на ограничение 1 потока для clientOutboundChannel, порядок сохраняется.

Эта проблема не в SocketJS, а является ограничением текущей конструкции веб-сокета Spring.

Автор: Zhichao Размещён: 17.04.2015 09:38

8 плюса

133 Репутация автора

Это проблема дизайна веб-сокета Spring. Чтобы получать сообщения в правильном порядке, вы должны установить для corePoolSize клиентов websocket значение 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);
    }
}
Автор: Dawid Kunert Размещён: 08.11.2016 09:22

2 плюса

1393 Репутация автора

Я тоже столкнулся с этой проблемой. Я не люблю ограничивать размер пула потоков до 1, так как это приведет к перегрузке приложения. Вместо этого я использовал StripedExecutorService для обработки сообщений, входящих и выходящих из моего приложения. Этот тип службы executor гарантирует упорядоченную обработку сообщений для задач с одинаковой полосой. Для меня я использую идентификатор сеанса WebSocket как полосу. Зарегистрируйте этого исполнителя через ChannelRegistration.taskExecutor () на вашем входящем, брокерском и исходящем каналах, и это будет гарантировать заказанные сообщения. Выберите свою полосу с умом.

Автор: danieljohngomez Размещён: 24.11.2017 03:07

4 плюса

221 Репутация автора

похоже, что есть встроенный чередующийся исполнитель, так что просто включите его:

@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

Автор: Jason Размещён: 20.02.2019 10:09
Вопросы из категории :
32x32