Как регулировать объем данных, отправляемых в очередь Stomp (обработка веб-сокетов), чтобы гарантировать, что я не переполну буфер? - PullRequest
0 голосов
/ 29 января 2020

У меня есть два Java процесса, и я подключаю их с помощью веб-сокета при весенней загрузке. Один процесс действует как клиент и подключается следующим образом:

    List<Transport> transports = new ArrayList<Transport>(1);
    transports.add(new WebSocketTransport(new StandardWebSocketClient()));
    WebSocketClient client = new SockJsClient(transports);

    WebSocketStompClient stompClient = new WebSocketStompClient(client);
    stompClient.setMessageConverter(new MappingJackson2MessageConverter());

    StompSessionHandler firstSessionHandler = new MyStompSessionHandler("Philip");
    stompClient.connect("ws://localhost:8080/chat", firstSessionHandler);

Обработчик сеанса расширяет StompSessionHandlerAdapter и предоставляет следующие методы (я подписываюсь по имени пользователя, чтобы каждый клиент мог получать свои собственные сообщения):

@Override
public void afterConnected(
        StompSession session, StompHeaders connectedHeaders) {
    session.subscribe("/user/" + userName + "/reply", this);
    session.send("/app/chat", getSampleMessage());
}

@Override
public void handleFrame(StompHeaders headers, Object payload) {
    Message msg = (Message) payload;
    // etc.....
}

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

@Autowired
private SimpMessagingTemplate template;

@MessageMapping("/chat")
public void send(
        Message message)
        throws Exception {

    template.convertAndSendToUser(message.getFrom(),
                             "/reply",
                                        message);
}

В конфигурации websocket я переопределяю метод для установки ограничений:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic", "/user");
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
    registration.setMessageSizeLimit(500 * 1024);
    registration.setSendBufferSizeLimit(1024 * 1024);
    registration.setSendTimeLimit(20000);
}

У меня такой вопрос: если нагрузка на сервер становится достаточно высокой, и я превышаю предел, веб-сокет терпит неудачу катастрофически, и я хочу этого избежать. Я хотел бы, чтобы у контроллера была возможность спросить посредника сообщений «будет ли это сообщение помещаться в буфер?», Чтобы я мог ограничиться, чтобы оставаться в пределах ограничения. Я искал документацию API, но не вижу никакого способа сделать это. Существуют ли другие очевидные решения, которые мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 04 февраля 2020

На самом деле я нашел решение, поэтому, если кому-то интересно, вот оно.

На серверной конфигурации веб-сокетов я установил Перехватчик на Исходящем канале (это часть API), который вызывается после каждой отправки от встроенного брокера.

Итак, я знаю, сколько поступает, что я отслеживаю в своем классе Controller, и я знаю, сколько выходит через перехватчик, который я установил, и это позволяет мне всегда оставаться ниже предела.

Контроллер, прежде чем принимать какие-либо новые сообщения, которые должны быть поставлены в очередь для брокера, сначала определяет, достаточно ли места, и если нет, ставит сообщение в очередь во внешнем хранилище до время становится доступным.

...