spring documentationに従って、STOMP over WebSockets を使用して JSON を送受信できます。ただし、大量の高レートではパフォーマンスが低下するため、バイナリ メッセージの使用をプロファイルしたいと思います。
- Spring-WebSockets 4.0
- Chrome 35 で実行されている JavaScript クライアント
- ストンプ.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
私が試したこと
STOMP の T は Text を表していることは理解していますが、Spring のドキュメントでは、少なくともプレーンな WebSocket でバイナリ メッセージが可能であることを示唆しています。
STOMP はテキスト ベースですが、バイナリ メッセージの送信も可能です。
- 送信コードをデバッグすると、見る限りバイト [] のままのようです
- 受信中の stomp.js ライブラリのデバッグ。基礎となる ws.onmessage コールバックで受信すると、メッセージは文字列のように見えます (stomp-1.7.1.js の 243 行目)。
- たくさんの検索 - これはほとんど情報がない珍しいトピックのようです
- stomp.js のソース コードを見てみます。バイナリへの唯一の参照は ws.binaryType = "arraybuffer" です。
更新: サーバー側でさらにデバッグを行いました。org.springframework.web.socket.TextMessage は、 org.springframework.web.socket.BinaryMessageではなく、常に org.springframework.web.socket.messaging.StompSubProtocolHandler 内で使用されるようです。この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)));
}
私の質問
- このアプローチは、このテクノロジーの組み合わせで可能ですか?
- 私はいくつかの重要なステップを逃していますか?
- 誰でも実際の例を教えてもらえますか