Spring Boot и WebSockets - потеряно соединение при отправке высокого throuput через защищенный websocket по протоколу Stomp - PullRequest
0 голосов
/ 27 июня 2019

У меня есть 2 конечные точки WebSockets:

registry.addEndpoint("/ws-handshake").withSockJS();
registry.addEndpoint("/api/admin/ws-handshake").withSockJS();

Первый из них без аутентификации, второй защищен Spring Boot Security, использует ту же конфигурацию, что и HTTP-безопасность, и использует OAuth2. Заголовок авторизации используется для подключения к защищенной конечной точке.

Я использую простой цикл for, так как это POC, но такой же объем данных будет использоваться в производственной среде, чтобы вернуть много записей, это делается с помощью класса SimpMessageSendingOperations, предоставляемого Spring Boot:

    private SimpMessageSendingOperations messagingTemplate;

    @MessageMapping("/tail-topic")
    public void tailLogSendToTopic(@Payload WebSocketPoCPayload payload) throws InterruptedException {
        String topicName = "/topic/logentries";
        for (int i = 0; i < 3000; i++) {
            WebSocketPoCMessage message = new WebSocketPoCMessage(String.format("%d : returning payload %s", i, payload.getName()));
            messageTemplate.convertAndSend(topicName, message);
            // TimeUnit.MILLISECONDS.sleep(50);
        }
        log.info("done returning all messages");
    }

Когда я отправляю запрос через незащищенную конечную точку, все работает нормально, я получаю все на стороне клиента.

Когда я отправляю запрос через защищенную конечную точку, все работает нормально до определенного номера полезной нагрузки (например, 1499, всегда совпадает с номером полезной нагрузки). Если я не раскомментирую тайм-аут, но потребуется больше 10 миллисекунд, чем снова, я потеряю соединение, но с более поздним номером.

Похоже, мои настройки безопасности отключили соединение, если они видят слишком много трафика, я что-то упустил в своей конфигурации безопасности?

1 Ответ

0 голосов
/ 03 июля 2019

Поскольку ответа на этот вопрос, похоже, нет, я приму временный обходной путь как решение:

private SimpMessageSendingOperations messagingTemplate;

@MessageMapping("/tail-topic")
public void tailLogSendToTopic(@Payload WebSocketPoCPayload payload) throws InterruptedException {
    String topicName = "/topic/logentries";
    for (int i = 0; i < 3000; i++) {
        WebSocketPoCMessage message = new WebSocketPoCMessage(String.format("%d : returning payload %s", i, payload.getName()));
        messageTemplate.convertAndSend(topicName, message);
        TimeUnit.MILLISECONDS.sleep(50);
    }
    log.info("done returning all messages");
}
...