9

STOMP を介して SockJS を介して Spring バックエンドに接続しています。すべてが正常に機能し、構成はすべてのブラウザーなどでうまく機能します。ただし、最初のメッセージを送信する方法が見つかりません。シナリオは次のようになります。

  1. クライアントはトピックに接続します
    関数接続() {
        var socket = new SockJS('http://localhost:8080/myEndpoint');
        stompClient = Stomp.over(ソケット);
        stompClient.connect({}, 関数(フレーム) {
            setConnected(真);
            console.log('接続済み:' + フレーム);
            stompClient.subscribe('/topic/notify', 関数(メッセージ){
                showMessage(JSON.parse(message.body).content);
            });
        });
    }

バックエンド構成は多かれ少なかれ次のようになります。

    @構成
    @EnableWebSocketMessageBroker
    public class WebSocketAppConfig extends AbstractWebSocketMessageBrokerConfigurer {   
    ...
    @オーバーライド
    public void registerStompEndpoints(最終 StompEndpointRegistry レジストリ) {
        registry.addEndpoint("/myEndpoint").withSockJS();
    }

  1. バックエンドから (接続イベントで) 自動応答をクライアントに送信して、クライアント (クライアント) が GET を送信する必要なく、データセット (たとえば、db から sth を読み取る) をクライアントに提供できるようにします。リクエスト(またはその他)。要約すると、彼が接続した直後に、SimMessagingTemplate オブジェクトを使用してトピックに関するメッセージを彼に送信したいだけです。

通常、テンプレートが既に自動配線されている場合は、REST コントローラーなどで次のようにします。

    @Autowired
    プライベート SimpMessagingTemplate テンプレート。
    ...
    template.convertAndSend(TOPIC, new Message("動作します!"));

接続イベントでこれを達成するにはどうすればよいですか?

アップデート

私はそれを機能させることができました。しかし、私はまだ構成について少し混乱しています。ここでは、最初のメッセージを送信する方法を 2 つの構成で示します。

1) 最初の解決策

JS部分

stompClient.subscribe('/app/pending', function(message){
    showMessage(JSON.parse(message.body).content);
});
stompClient.subscribe('/topic/incoming', function(message){
    showMessage(JSON.parse(message.body).content);
});

Java部分

@Controller
public class WebSocketBusController {
    @SubscribeMapping("/pending")

構成

@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}

...およびその他の呼び出し

template.convertAndSend("/topic/incoming", outgoingMessage);

2) 2 番目の解決策

JS部分

stompClient.subscribe('/topic/incoming', function(message){
    showMessage(JSON.parse(message.body).content);
})

Java部分

@Controller
public class WebSocketBusController {
    @SubscribeMapping("/topic/incoming")

構成

@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    // NO APPLICATION PREFIX HERE
}

...およびその他の呼び出し

template.convertAndSend("/topic/incoming", outgoingMessage);

まとめ:

最初のケースでは、2 つのサブスクリプションを使用します。これは避けたかったので、1 つだけで管理できると考えました。

ただし、2 番目のものにはアプリケーションの接頭辞がありません。しかし、少なくとも、提供されたトピックをリッスンし、最初のメッセージを送信するための単一のサブスクリプションを持つことができます。

4

2 に答える 2

3

でそれを行うことはできませんがconnect@SubscribeMappingその場合は が行います。

そのアノテーションでサービスメソッドをマークするだけで、結果がsubscribe関数に返されます。

春のリファレンスマニュアルから:

@SubscribeMapping アノテーションを使用して、サブスクリプション要求を @Controller メソッドにマップすることもできます。メソッドレベルでサポートされていますが、同じコントローラー内のすべてのメッセージ処理メソッドで共有マッピングを表現するタイプレベルの @MessageMapping アノテーションと組み合わせることもできます。

デフォルトでは、 @SubscribeMapping メソッドからの戻り値はメッセージとして直接接続されたクライアントに送信され、ブローカーを通過しません。これは、要求と応答のメッセージの相互作用を実装するのに役立ちます。たとえば、アプリケーション UI の初期化中にアプリケーション データを取得する場合などです。または、@SubscribeMapping メソッドに @SendTo アノテーションを付けることができます。この場合、結果のメッセージは、指定されたターゲット宛先を使用して「brokerChannel」に送信されます。

アップデート

次の例を参照してください: https://github.com/revelfire/spring4index.htmlの 24 行目が呼び出されたときにどのように送信できるかをテストします: stompClient.subscribe('/user/queue/socket/responses' ...スプリングコントローラーから?

さて、このように見てください:

@SubscribeMapping("/queue/socket/responses")
public List<Employee> list() {
     return getEmployees();
}

Stomp クライアント部分は同じままです。

于 2014-07-15T11:06:48.693 に答える