問題タブ [spring-jms]

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 に答える
1541 参照

spring - Spring DefaultMessageListenerContainer MDP 初期化

DefaultMessageListenerContainerの初期化で初期化を実行する最良の方法は何ですか? 現在、私は最初のメッセージを待っており、ブール変数を使用してそれを追跡していますが、これはあまりきれいではありません。より良い方法はありますか?メッセージ駆動型 POJO が起動したら、特定のデータを読み取ってキャッシュにロードしたいので、メッセージ処理が高速になります。

(編集済み)

Spring 構成フラグメント:

リスナーがメッセージを受信する前に、いくつかの初期化を行いたいと思います。

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

spring-annotations - Spring DefaultMessageListenerContainer/SimpleMessageListenerContainer (JMS/AMQP) アノテーション構成

そのため、多くのチームが共通のサービスを使用し、共通のアーキテクチャに従っているプロジェクトに取り組んでいます。使用されているサービスの 1 つはメッセージングであり、現在は ActiveMQ を使用した JMS です。ほとんどすべてのチームは、メッセージの作成と送信に関する厳密な一連のルールに従う必要があります。つまり、すべてが pub-subscribe であり、送信されるメッセージは次のようなものです。

「jsonPayload」は、すべてのチームが拡張する基本クラスから取得されるため、共通の属性があります。

したがって、基本的に JMS では、全員が常に同じ種類のメッセージを送信しますが、異なる ActiveMQ トピックに送信します。メッセージ (WorkDTO) が JMS 経由で送信される場合、最初に JSON オブジェクトに変換され、次に TextMessage で送信されます。

チームがトピックのサブスクライバーを作成する場合は常に、DefaultMessageListenerContainer を作成し、メッセージを受信するように適切に構成します (Java ベースの Spring 構成を使用しています)。基本的に、チームが定義するすべての DefaultMessageListenerContainer は、メッセージを受信する宛先とメッセージ ハンドラーを除いてほとんど同じです。

そのような場合、アノテーションを介してメッセージング構成をさらに抽象化する方法に誰もがどのようにアプローチするのだろうと思っていましたか? つまり、誰もがほぼ同じ要件に従う必要があるため、次のようなものが役立つ可能性があります。

もちろん、 @Listener アノテーションを使用して DefaultMessageListenerContainer を構成する方法の部分は省略しました。BeanFactoryPostProcessor を調べて、必要なクラスを作成し、それらをアプリケーション コンテキストに追加しましたが、そのすべてを行う方法がわかりません。

私が質問する理由は、JMS/ActiveMQ から AMQP/RabbitMQ に切り替えており、アノテーションを使用してメッセージング構成をさらに抽象化したいからです。AMQP は JMS とは違うので、設定の詳細は少し異なります。AMQP から別のものに切り替えるとは思えません。

ここで、チームは宛先の名前と、サブスクリプションを永続化するかどうかを知るだけで済みます。

これはつい最近ふと頭に浮かんだことです。これについて何か考えはありますか?

ただし、過度に複雑なことはしたくないので、別の方法として、宛先とメッセージ ハンドラーを指定して事前構成済みの DefaultMessageListenerContainer を返す便利なメソッドを作成することもできます。

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

java - JMS トピックとの同期動作

キューを使用してメッセージを送信し、トピックを同期的にリッスンするフローの疑似コードを以下に示します。基礎となる JMS プロバイダーは Tibco EMS です。

ここで、作成した同じオブジェクトを使用してトピックをリッスンしsession、応答があるまで待ちます。

私が直面している問題は、メッセージ オブジェクトが null として出力されることです。jms 監視ツールでテストしたところ、トピックにいくつかのメッセージがありますが、上記のコードは 60 秒経過してもメッセージを取得できません。

ここで何が欠けているのですか?

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

jms - JMS メッセージが追加されない

HornetQ の使用中に奇妙な状況に直面しています。

私のアプリケーション アーキテクチャ -

  • JMS プロバイダー : HornetQ (スタンドアロン サーバー、他には使用されません。このサーバーに Q1 と Q2 などの 2 つのキューを作成しました)。
  • Producer : 別のマシンにデプロイされた Web アプリケーション。このアプリケーションは、「ObjectMessage」のインスタンスを作成し、「Job」クラスのインスタンスを引数として「ObjectMessage.setObject()」メソッドに渡し、メッセージを Q1 に追加します。Spring JMS を使用します。

メッセージをキューに追加する前に、メッセージに「AGENT」という名前の文字列プロパティも設定します。

奇妙なのは、ObjectMessage.setStringProperty("AGENT", null) を呼び出した場合、またはメッセージ自体にプロパティを追加しなかった場合、メッセージが Q1 に追加されないことです。ただし、これは第 2 四半期には発生せず、HornetQ の JMX コンソールでメッセージを確認できます。

注意すべきキュー固有の構成はありますか?

あいまいな表現で申し訳ありません - 私のチームと私は、この問題を解決するのに苦労してきました。

ありがとう。

0 投票する
2 に答える
572 参照

spring - SpringJMSリスナーでのHttpservletRequestと応答

誰かがSpringJMSリスナークラスでHttpServletRequestとHttpServletResponseを取得する方法があるかどうかを知ることができますか?私のJMSリスナーはspringContext.xmlファイルで定義されています。

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

jms - ActiveMqとAtomikosを使用して2回デキューされたJMSメッセージ

ActiveMqをJMSサーバーとして使用し、Atomikosをトランザクションマネージャーとして使用しています。

ActiveMq Admin Webインターフェイスで、1つのメッセージがキューに入れられたのに、2つ(!)のメッセージがデキューされたことがわかります。

ただし、jmsコンシューマーはメッセージを1回だけ処理するため、処理に重複はありません。単純なSpringJmsTransactionManagerを使用すると、1つのキューに入れられたメッセージと1つのデキューされたメッセージがあります。この問題は、AtomikosJTAトランザクションマネージャーでのみ発生します。

何が問題ですか?2回デキューされたメッセージが表示されないようにAtomikosを構成するにはどうすればよいですか?

私の設定は以下の通りです。チュートリアルとほぼ同じです。ところで、AtomikosのSpring統合の例はうまく機能しますが、Spring 2.0を使用しているのに対し、私はSpring3.1を使用しています。

消費者クラスは次のとおりです。

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

spring - メッセージ リスナーでのメッセージの再配信とエラー処理

cosumer が消費できる速度よりも速い速度でメッセージを生成しているプロデューサーがあります。消費者側の技術スタックとして Spring JMS 統合を使用しています。現在、AUTO_ACKNOWLEDGEモードを使用しています。

リスナーのメソッドでは、受信時にクライアント側のジョブをジョブ キューに送信し、メソッドonMessage()から戻る予定です。onMessage()これは、a) 処理が失敗した場合、または b) 処理中にサーバーがダウンした場合、回復する方法がないことを意味します。

を使用するオプションを検討しましたCLIENT_ACKNOWLEDGEが、これは、タイムスタンプが大きいメッセージを確認すると、タイムスタンプが小さいすべてのメッセージが自動的に確認されることを意味します。新しいタイムスタンプを持つメッセージの処理が成功しても、古いタイムスタンプを持つすべてのメッセージが完全に処理されるわけではないため、これは明らかに望ましくありません。実際には、メッセージごとの承認を確認しています。ただし、これは設計上の欠陥があることを意味することをどこかで読みました。

もう 1 つのオプションはSessionAwareMessageListener、Spring が提供するインターフェースを使用することです。このインターフェイスを使用する契約では、 aJMSExceptionがスローされた場合onMessage、メッセージが再配信されると規定されています。ただし、これを目的に使用する方法が完全にはわかりませんでした。

私はこれについてさらに掘り下げますが、皆さんからの助けをいただければ幸いです。

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

java - リモート マシンから Grails ActiveMQ にアクセスする

私は JMS を初めて使用します。JMS および ActiveMQ プラグインのドキュメントを読みましたが、まだ明確ではありません。

ActiveMQ が埋め込まれたマシン A でホストされている Grail アプリがメッセージを送信できるシステムを構築しようとしています。また、JMS プラグインのみを使用してマシン B でホストされている別の Grails アプリは、メッセージを受信して​​応答できるはずです。

ドキュメントを読んだ後、コントローラーがマシンAのサービスにメッセージを送信し、コンソールにメッセージを表示するマシンAにgrailsアプリを作成しました。現在、マシン B で同様の動作をするサービスを実装しようとしています。

マシン B で構成した後、私の resource.groovy は次のようになります。

マシン A と B のサービスは次のようになります。

マシン A のコントローラー:

マシン A: プラグインがインストールされた Unix 上の Grails 2.1 (ActiveMQ および JMS)

マシン B: プラグインがインストールされた Unix 上の Grails 2.1 (JMS)

現在の問題:

マシン A のコントローラーからメッセージが送信されると、マシン A のサービスはコンソールにメッセージを表示しますが、マシン B はメッセージを表示しません。

想定: マシン B もメッセージを受信する必要があります

0 投票する
3 に答える
1882 参照

java - SpringMDP-悪いメッセージでシャットダウンする方法

WebSphereMQv7.1で入力キューをリッスンするSpringを使用してDefaultMessageListenderContainerSpringMDPを実装しました。悪いメッセージが入ってくると(それが原因でRuntimeException)、現在起こっていることは、トランザクションがロールバックされ、メッセージがキューに戻されることです。ただし、MDPは無限ループに入ります。

質問1:私の要件では、悪いメッセージが表示された瞬間に処理をシャットダウンできるようにしたいと思います。再試行は必要ありません。System.exit()(原油またはその種のメソッドとは対照的に)悪いメッセージが表示された場合にメッセージリスナーを正常にシャットダウンすることは可能ですか?私はそれが無限ループに入るのは絶対に好きではありません。

編集:

質問2:リスナーコンテナを停止または一時停止して、メッセージのそれ以上の処理を停止する方法はありますか?

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

weblogic - JavaはOracle AQからメッセージをデキューできません

Spring DefaultMessageListenerContainer に基づくアプリケーションを weblogic にデプロイしようとしています。外部サーバーを使用して weblogic をセットアップし、JNDI 名で AQ 接続ファクトリと宛先にアクセスできるようにしました。

受信したメッセージをログに記録する単純なメッセージ リスナーがあります (テストのみ)。このメッセージ リスナーを以下に示す Spring DMLC でラップします。

このアプリケーションを weblogic にデプロイしようとすると、DMLC から次の例外が発生します。

Javaがキューでメッセージを受信できるように、これを解決する方法を知っている人はいますか?

ありがとう