0

次のように、ユーザー定義の宛先チャネルに公開するスプリング ブート アプリケーションがあります。

@Autowired
private SimpMessagingTemplate template;

public void send() {
   //..
   String uniqueId = "123";
   this.template.convertAndSendToUser(uniqueId, "/event", "Hello");
}

次に、SockJS クライアントを踏みつけて、それにサブスクライブし、メッセージを受信できます。「/data」というSpringアプリケーションに登録されたストンプエンドポイントがあるとします

var ws = new SockJS("/data");
var client = Stomp.over(ws);
var connect_fallback = function() {
   client.subscribe("/user/123/event", sub_callback);
};

var sub_callback = function(msg) {
    alert(msg);
};

client.connect('','', connect_callback);

実際には、同じ個別のユーザー宛先にサブスクライブする複数のユーザー クライアントが存在するため、各パブリッシュ/サブスクライブ チャネルは 1 対 1 ではなく、Spring の "/topic" の概念をプログラムで定義する必要があるため、この方法でのみ実行しています。 「/queues」は 1 人のユーザーのみが使用できます。ユーザー宛先にサブスクライバーがなくなったことをどのように知ることができますか? また、ユーザー宛先を削除するにはどうすればよいですか?

4

2 に答える 2

0

チャネル インターセプターを追加し、Eclipse のデバッグ モードで実行されているコード セグメント内にブレークポイントを設定した後、メッセージ ハンドラーによって保持されているレジストリ オブジェクトに websocket セッションと宛先マッピングのコレクションがあることがわかりました。メッセージ チャネル オブジェクト内に格納されます。純粋にユーザーの宛先方法についてはわかりませんが、トピックについてこれを見つけました。

ただし、Spring は、少なくともメッセージを渡さずに、関数を呼び出してすべてのトピックのすべてのサブスクライバーのリストを取得するために API を開いたままにしません。役に立ちそうなものはすべて非公開に設定されているため、プログラムからアクセスすることはできません。購読解除/切断されているトピックに他のリスニングクライアントが残っていない場合にのみ、クライアントの購読解除または切断時にアクションをトリガーしたいので、これは役に立ちません。

現在、ActiveMQ などのフル機能のブローカーを組み込んで、問題を解決できる可能性があるかどうかを確認しています。

于 2016-02-26T01:09:23.873 に答える