問題タブ [spring-messaging]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1761 参照

spring-security - Spring がデフォルトの simpSessionId を生成しないようにするにはどうすればよいですか?

websocket と STOMP を使用して春を設定しようとしています。

クライアントで、ヘッダー変数 'simpSessionId':%session_id% を送信します

ただし、メッセージを受信すると、Spring は常に提供されたヘッダーを nativeHeaders と呼ばれるキーに配置し、デフォルトの simpSessionId をヘッダー ルートに配置します。

代わりに提供されたセッションIDを春に取得させる方法はありますか?

編集済み

OK、携帯電話アプリとウェブサイトが同じサーバーにアクセスしています。携帯電話アプリで Webocket をセットアップできる必要があります。

携帯電話アプリで、従来の REST エンドポイントを介してサーバーにログインし、成功すると応答でセッション ID を受け取ります。

携帯電話で webstomp-client、Spring 4.1.9、Spring Security 4.1、Spring Session 1.2.0 を使用しています。

トークンを使用してソケット CONNECT で STOMP Websocket にログインするのが理想的ですが、webstomp-client は CONNECT でカスタム ヘッダーを渡さないため、現在のところそれが不可能であることを理解しています。

2 つの問題があります。

  • 後続のリクエストで REST ログインで取得したセッション ID を渡すにはどうすればよいですか? SPRING.SESSION.ID などのヘッダーを追加しようとしましたが、コードをステップ実行すると、メッセージ処理が常に 1、2 などにデフォルト設定されている simpSessionId に戻ることがわかります。 AbstractSessionWebsocketMessageBrokerConfigurer を拡張しようとしましたが、私のセッションIDを取得しません。常に空のsimpSessionAttributesを調べます。

  • コードは、Web ブラウザーのシナリオである http セッションを取得しようとしているようにも見えます。これは無視するしかないと思います

  • セッションの有効期限が切れます。有効期限が切れた可能性のあるセッションの戦略は何ですか? remember-me スタイルの認証トークンも渡すべきではないですか? それとも、永続的なステートレス セッションに依存する必要がありますか? これは私には明確ではなく、この側面は文書化されていないようです。

明らかに、私は何か非常に間違ったことをしています。これが私の設定です:

@Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds=1200) public class SessionConfig {

}

===

==

====

=== 簡潔にするために、ここにあるいくつかの追加のセキュリティ構成を削除しました。

@Configuration @EnableWebSecurity @Order(100) public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

===

0 投票する
1 に答える
382 参照

java - メッセージが受信されたことを確認する

クライアントでプッシュ通知を送信できるアプリケーションを作成する必要があります。ただし、クライアントが切断される場合があるため、通知を保存して、クライアントが再接続したときにクライアントに送信したいと考えています。

これを達成する方法はありますか?送信する前にクライアントが存在するかどうかを知る方法、または通知が十分に受信されているかどうかを知る方法が必要です。そして、私の通知はクライアント固有のものです。

多くのコードを披露することはできませんが、次のようなものを使用したいと思います:

spring-websocket と stomp-endpoint を使用しています。

ありがとうございました !

0 投票する
1 に答える
1625 参照

java - 内部 Spring Boot/Simple Broker トピックキューをサブスクライブする方法は?

/user/exchange/amq.direct/chat.messageトピック キューをサブスクライブしてメッセージに応答するボットを作成するには、内部スプリング ブート トピックをサブスクライブする必要があります。

}

私のコントローラー:

SimpMessagingTemplate でメッセージを入れた内部キュー/トピックをサブスクライブする方法は?

0 投票する
1 に答える
6887 参照

spring - Spring Sockjs Java クライアント メッセージ コンバーターの構成方法

STOMP を使用する SockJS Java クライアントが 1 つあります。このhttps://github.com/rstoyanchev/spring-websocket-portfolio/blob/master/src/test/java/org/springframework/samples/portfolio/web/load/StompWebSocketLoadTestClient.javaに基づいています。

私のコード:

次のように構成するときに確認してくださいstompClient

そして私はメッセージを送ります:

ここで、message は String クラス オブジェクトであり、サーバー側は次の変換エラーをスローしました。

エラーを観察します。

MessageConversionException: GenericMessage [payload=byte[33]、headers={simpMessageType=MESSAGE、stompCommand=SEND、nativeHeaders={destination=[/app/chatchannel] の [[B] から [org.gasmart.websocket.Message] に変換できません。 ]、content-type=[text/plain;charset=UTF-8]、content-length=[33]}、simpSessionAttributes={ip=/127.0.0.1:59629}、simpHeartbeat=[J@147a2bf、contentType=text /plain;charset=UTF-8, lookupDestination=/chatchannel, simpSessionId=79431feb8b5f4a9497492ccc64f8965f, simpDestination=/app/chatchannel}]

content-typeヘッダーが SockJS Java クライアントによって作成されていることを確認してください。

次のように構成stompClientした場合:

そして私はメッセージを送ります:

メッセージがバイト配列である場合、サーバーはエラーをスローしません。しかし、送信する前にすべての文字列をバイト配列に変換する必要があります。サーバーが SimpleMessageConverter で送信された同じ JSON オブジェクトと、StringMessageConverter で送信された 1 つの JSON オブジェクトを変換できる理由を理解したいと思います。

JavaScript クライアントと Java クライアントから送信された JSON を比較します。どちらも同じ JSON メッセージを送信します。次に、ChannelInterceptor を実装して、メッセージが対応するコントローラーに送信される前に受信したメッセージを出力します。

対応するサーバー コントローラーは次のとおりです。

Java 出力:

JavaScript: SockJS + Stomp.js:

違いを観察してください: content-type=[text/plain;charset=UTF-8]

Spring メッセージングには、さらに多くのコンバーターがあります。

Spring メッセージング コンバーター

このパッケージで SimpleMessageConverter と StringMessageConverter を確認できます。しかし、ByteArrayMessageConverter、CompositeMessageConverter、SmartMessageConverter などがあります。このコンバーターはどのように機能しますか?

Java クライアントから文字列を送信したい場合、どのコンバーターが必要ですか?

JScript クライアントから送信されたときにサーバーが JSON メッセージ {"from":"cliente1","text":"KIKO"} を変換できるのに、Java クライアントから送信されたときに変換できないのはなぜですか?

0 投票する
1 に答える
1545 参照

spring - SubProtocolWebSocketHandler と stompSubProtocolHandler を使用した例はありますか?

stompSubProtocolHandler と SubProtocolWebSocketHandler の使用例が見つかりませんか?

この SubProtocolWebSocketHandler クラスを拡張する必要がありますか?

StompSessionHandlerAdapter を拡張して動作している Sockjs Java クライアントのハンドラーを使用しています。接続、購読、メッセージの送信ができます:

プライベート静的クラス ProducerStompSessionHandler extends StompSessionHandlerAdapter { ...

}

しかし、別のユーザーが、SubProtocolWebSocketHandler と stompSubProtocolHandler という 2 つの実装があると言っているのを見ました。 https://stackoverflow.com/a/28306539/6243317

これらは、STOMP クライアントを介した Java Websocket の実装ですか? どのように使用しますか?利点?なぜこの実装を使用するのですか?

0 投票する
1 に答える
317 参照

java - Spring Cloud Stream プロジェクトには Web サーバー (Tomcat) が必要ですか?

Spring Cloud Streamを使用して、メッセージング駆動型のマイクロサービスを作成しています。

  • プロジェクト A: プロデューサー (Spring Cloud Stream、統合された tomcat とそのポート: 8080)
  • プロジェクト B: コンシューマー (Spring Cloud Stream、統合された tomcat とそのポート: 8081)
  • メッセージ ブローカー: RabbitMQ (amqp ポート: 5672)

私の質問は: プロジェクト A と B の場合、統合された Web サーバー/ポート (Tomcat) が必要ですか? それとも、一般的な Java アプリケーションで十分でしょうか?

0 投票する
0 に答える
273 参照

spring - spring-messaging リスナーにメッセージを送信しますか?

Springメッセージング@MessageMappingアノテーション付きメソッドにメッセージを送信するにはどうすればよいですか? 私は次のコードを持っています:

そして、私はメッセージを送信しようとしています:

デフォルトで Spring を作成するタイプ org.springframework.messaging.simp.SimpMessagingTemplate の messagingTemplate 。

しかし、働かないでください。メッセージのタイプは org.springframework.messaging.Message です

0 投票する
1 に答える
14076 参照

spring - DefaultJmsListenerContainerFactory と同時接続がシャットダウンしない

Spring 4.x の DefaultJmsListenerContainerFactory を使用して、ActiveMQ キューに接続し、@JmsListener を使用してそのキューからのメッセージを処理し、メッセージを同じ ActiveMQ ブローカーのトピックにプッシュします。

コンシューマ/リスナーとプロデューサの両方に単一のキャッシング接続ファクトリを使用しており、コンシューマではなくプロデューサをキャッシュできるように、キャッシュ コンシューマを false に設定しています。また、同時実行数を 1 ~ 3 に設定しました。これにより、アプリケーションの起動時にキューに少なくとも 1 つのコンシューマーが存在すると予想されます。メッセージが増加すると、コンシューマーの数は 3 に達します。メッセージが減少すると、コンシューマーの数も 1 に戻ると予想していました。しかし、スレッド (defaultmessagelistenercontainer-2/3) を見ると、それらは待機状態にあり、シャットダウンしていません。負荷が低下すると、多くのコンシューマーもシャットダウンすることが予想されるというのは、予想される動作ではないでしょうか? 以下の私の設定を見てください。

ApplicationContext.java

アプリケーションのプロパティ

0 投票する
1 に答える
805 参照

javascript - javaスクリプト関数のSpringメッセージタグにvarの値を格納する方法は?

ある種の文字列文字列を返す関数が1つあります文字列は静的ではなく動的です

そして、言語を変更するために春のメッセージタグを使用しています

静的文字列を渡すと正常に動作します

しかし、varの動的な値を保存したいので、var 'error_msg'を使用しています

jspページで例外を与える

0 投票する
1 に答える
6364 参照

java - Spring Websocket プログラムから STOMP ERROR を送信する

SUBSCRIBE リクエストを受け入れる Spring Websocket Stomp アプリケーションがあります。

アプリケーションには、SUBSCRIBE のハンドラーがあります。つまり、

サブスクリプションを検証するために使用します。

onApplicationEventで何かをチェックし、この関数から STOMP ERROR メッセージをクライアントに送り返します。

このレシピを見つけましたSpring WebSocketでエラーメッセージをSTOMPクライアントに送信する方法は? しかし、outboundChannel を取得する方法を理解する必要があります。

次のコードも試しました:

そして、トピックをサブスクリプショントピックと /queue/error トピックにしようとしました。ただし、メッセージがクライアントに伝播することはありませんでした。

クライアントでは、次を使用します。

私の目標は、STOMP ERROR を送信したときに function(error) を呼び出すことです。

Outboundchannel を取得するなどして、適切な STOMP ERROR を正確に送信する方法を教えてください。