I am able to send and receive JSON with STOMP over WebSockets following spring documentation. However performance is poor at large high rates, so I wish to profile the use of binary messages.
- Spring-WebSockets 4.0
- JavaScript client running in Chrome 35
- stomp.js 1.7.1
Sending
I send messages using SimpMessageTemplate with the necessary broker relay - see spring documentation
@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);
}
}
Receiving
A JavaScript client receives data using stomp.js using the standard mechanism.
var subscription = client.subscribe("/app/binarydemo", new function(message) {
console.log("RX message", typeof message.body, message.body.length);
});
Messages are received, but as Strings, with console output as follows. I'm expecting some raw type, like ArrayBuffer
RX message string 3
RX message string 3
Things I've tried
I realise the T in STOMP stands for Text, however the Spring documentation implies binary messages are possible at least with plain WebSockets, also the stomp specification states
STOMP is text based but also allows for the transmission of binary
messages.
- Debugging the sending code, and it appears to remain as byte [] for as far as I can see
- Debugging the stomp.js library whilst receiving. The message appears to be a String when received in the underlying ws.onmessage callback (line 243 in stomp-1.7.1.js)
- Lots of searching - this seems a rare topic with little information
- Looking at the stomp.js source code. The only reference to binary is ws.binaryType = "arraybuffer".
Update: I've done more debugging on the server side. It seems that org.springframework.web.socket.TextMessage is always used within org.springframework.web.socket.messaging.StompSubProtocolHandler rather than org.springframework.web.socket.BinaryMessage. I've raised a feature request for this 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)));
}
My question
- Is this approach possible with this mix of technologies?
- Am I missing some crucial step?
- Can anyone point me to a working example
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…