STOMP クライアント
Spring は、WebSocket クライアントを介した STOMP および TCP クライアントを介した STOMP を提供します。
まず、次の例に示すように、WebSocketStompClient を作成および構成できます。
WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new StringMessageConverter());
stompClient.setTaskScheduler(taskScheduler); // for heartbeats 上記の例では、StandardWebSocketClient を SockJsClient に置き換えることができます。これは、WebSocketClient の実装でもあるためです。SockJsClient は、フォールバックとして WebSocket または HTTP ベースのトランスポートを使用できます。詳細については、SockJsClient を参照してください。
次に、次の例に示すように、接続を確立し、STOMP セッションのハンドラーを提供できます。
String url = "ws://127.0.0.1:8080/endpoint";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect(url, sessionHandler);セッションの使用準備が整うと、次の例に示すように、ハンドラーに通知されます。
public class MyStompSessionHandler extends StompSessionHandlerAdapter {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
// ...
}
} セッションが確立されると、次の例に示すように、ペイロードを送信し、構成された MessageConverter で直列化できます。
session.send("/topic/something", "payload"); 宛先にサブスクライブすることもできます。subscribe メソッドは、サブスクリプションのメッセージのハンドラーを必要とし、サブスクライブ解除に使用できる Subscription ハンドルを返します。次の例に示すように、ハンドラーは、受信したメッセージごとに、ペイロードをデシリアライズするターゲット Object 型を指定できます。
session.subscribe("/topic/something", new StompFrameHandler() {
@Override
public Type getPayloadType(StompHeaders headers) {
return String.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
// ...
}
});STOMP ハートビートを有効にするには、WebSocketStompClient を TaskScheduler で構成し、オプションでハートビート間隔(ハートビートが送信される書き込み非アクティブの場合は 10 秒、接続を閉じる読み取り非アクティブの場合は 10 秒)をカスタマイズできます。
WebSocketStompClient は、非アクティブの場合、つまり他のメッセージが送信されない場合にのみハートビートを送信します。ブローカー以外の宛先を持つメッセージはアクティビティを表しますが、実際にはブローカーに転送されないため、これは外部ブローカーを使用するときに問題を引き起こす可能性があります。その場合、外部ブローカーを初期化するときに TaskScheduler を構成できます。これにより、ブローカー以外の宛先のメッセージのみが送信される場合にも、ハートビートがブローカーに転送されます。
パフォーマンステストに WebSocketStompClient を使用して同じマシンから数千のクライアントをシミュレートする場合、各接続は独自のハートビートタスクをスケジュールし、同じマシンで実行される多数のクライアントに対して最適化されないため、ハートビートをオフにすることを検討してください。 |
STOMP プロトコルは受信もサポートします。この場合、クライアントは receipt ヘッダーを追加する必要があり、送信またはサブスクライブの処理後にサーバーが RECEIPT フレームで応答します。これをサポートするために、StompSession は setAutoReceipt(boolean) を提供します。これにより、後続の送信またはサブスクライブイベントごとに receipt ヘッダーが追加されます。あるいは、手動でレシートヘッダーを StompHeaders に追加することもできます。送信とサブスクライブの両方が、Receiptable のインスタンスを返します。これを使用して、受信の成功および失敗のコールバックの登録に使用できます。この機能を使用するには、TaskScheduler と受信期限が切れるまでの時間(デフォルトでは 15 秒)でクライアントを構成する必要があります。
StompSessionHandler 自体が StompFrameHandler であることに注意してください。これにより、メッセージの処理からの例外の handleException コールバックおよび ConnectionLostException を含むトランスポートレベルエラーの handleTransportError に加えて、ERROR フレームを処理できます。
WebSocketStompClient の inboundMessageSizeLimit および outboundMessageSizeLimit プロパティを使用して、受信および送信 WebSocket メッセージの最大サイズを制限できます。送信 STOMP メッセージが制限を超えると、部分的なフレームに分割され、受信側で再構成する必要があります。デフォルトでは、送信メッセージにサイズ制限はありません。受信 STOMP メッセージのサイズが構成された制限を超えると、StompConversionException がスローされます。受信メッセージのデフォルトのサイズ制限は 64KB です。
WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setInboundMessageSizeLimit(64 * 1024); // 64KB
stompClient.setOutboundMessageSizeLimit(64 * 1024); // 64KB