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 フレームを処理できます。