Я могу отправлять и получать JSON с помощью STOMP через WebSockets, следуя весенняя документация. Однако при больших скоростях производительность низкая, поэтому я хочу профилировать использование двоичных сообщений.
- Spring-веб-сокеты 4.0
- Клиент JavaScript, работающий в Chrome 35
- stomp.js 1.7.1
Отправка
Я отправляю сообщения с помощью SimpMessageTemplate с необходимым ретранслятором брокера - см. весенняя документация
@Controller
public class DemoBinaryController {
@Autowired
private SimpMessagingtemplate template
@Scheduled(fixedDelay = 5000)
public void demo() throws Exception {
GenericMessage<byte[]> message = new GenericMessage<byte[]>(new byte[]{65,66,67});
template.send("/app/binarydemo", message);
}
}
Получение
Клиент JavaScript получает данные с помощью stomp.js, используя стандартный механизм.
var subscription = client.subscribe("/app/binarydemo", new function(message) {
console.log("RX message", typeof message.body, message.body.length);
});
Сообщения принимаются, но как строки, с выводом на консоль следующим образом. Я ожидаю какой-то необработанный тип, например ArrayBuffer
RX message string 3
RX message string 3
Вещи, которые я пробовал
Я понимаю, что T в STOMP означает текст, однако документация Spring подразумевает, что двоичные сообщения возможны, по крайней мере, с помощью простых веб-сокетов, а также спецификация топать указывает
STOMP основан на тексте, но также позволяет передавать двоичные сообщения.
- Отладка кода отправки, и, насколько я вижу, он остается как байт []
- Отладка библиотеки stomp.js во время получения. Сообщение выглядит как строка при получении в базовом обратном вызове ws.onmessage (строка 243 в stomp-1.7.1.js).
- Много поиска - это кажется редкой темой с небольшим количеством информации.
- Глядя на исходный код stomp.js. Единственная ссылка на двоичный файл — это ws.binaryType = "arraybuffer".
Обновление: я сделал больше отладки на стороне сервера. Кажется, что org.springframework.web.socket.TextMessage всегда используется внутри org.springframework.web.socket.messaging.StompSubProtocolHandler вместо org.springframework.web .socket.BinaryMessage. Я поднял запрос на функцию для этого SPR-12301.
message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();
byte[] bytes = this.stompEncoder.encode((Message<byte[]>) message);
synchronized(session) {
session.sendMessage(new TextMessage(new String(bytes, UTF8_CHARSET)));
}
Мой вопрос
- Возможен ли такой подход при таком сочетании технологий?
- Я пропустил какой-то важный шаг?
- Может ли кто-нибудь указать мне рабочий пример