У меня есть два 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, но не вижу никакого способа сделать это. Существуют ли другие очевидные решения, которые мне не хватает?
Спасибо.