2016-12-30 10 views
0

JMSを使用してメッセージを処理するアプリケーション(Springブートベース)があり、メッセージを受信するために複数のMQサーバー(ActiveMQ)に接続できる必要があります。もう1つの問題は、既存の接続を無効にし、実行時に別のサーバーに新しいものを追加する必要があるということです(サーバのURLを格納するDBと、config(URL) dbから現在の接続セットを再構成/リフレッシュ)Spring JMSランタイム接続管理

Spring、JMS、DIの設定に関する情報を掘り下げた後、DIは私のような動的シナリオにはうまく適合しないため、私が必要とする(おそらく私が間違っている)

サンプルアプリは

アプリケーションは

  • 設定DB豆各MQ用DB(URLリスト)
  • から
  • 負荷MQ構成(???)を起動する流れconfig:ConnectionFactoryの設定 - >接続 - >リスナー/エンドポイントのアタッチ

のAppライフサイクルDB(URLリスト)から

  • ハンドルREST要求
  • 負荷MQ構成
  • (???)各MQの設定の場合:
    • 新しいです項目:新しいConnectionFactoryの設定 - >接続 - >リスナー/エンドポイントの追加
    • 削除された項目:ドロップ接続

答えて

1

私は同じプロトコルを使ってAMQのdifferentsトピックに接続するためのプロパティに基づいたスプリングコンポーネントを作成することで同じことをしました。

私は一つ一つのために新しいコンテキストを作成し、このように創造に異なる特性を注入することにより、メインコンポーネントからそのコンポーネントの複数のインスタンスを実行します。

Properties source = new Properties(); 
PropertiesPropertySource ps = new PropertiesPropertySource("id", source); 
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(YourConfig.class); 
// I worked with xml context but this is the annotation based context creation 
ctx.getEnvironment().getPropertySources().addLast(ps); 

あなたはhttp://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/AnnotationConfigApplicationContext.html#scan-java.lang.String...-て設定クラスを使用するか、スキャンを設定することができます

各コンテキストは、実行時に閉じるメソッドを呼び出して閉じることができ、メインコンポーネントのマップにそれらを保持するので再作成できます。 メインコンテキストの@ComponentScan設定でこのコンポーネントがメインコンテキストから自動的にロードされないように除外されました

+0

応答が遅れて申し訳ありませんが、おかげで、あなたのソリューションは私が望むように動作します!再度、感謝します! –

0

Springを使用して達成するには2つの方法があります。

1スプリングプロファイルは -あなたはこのような MQ1、MQ2などの異なるプロファイルを維持し、プロファイルの各々についてJNDI構成 (JndiObjectFactoryBean)と豆を定義することができます。実行時には のロジックに基づいて、 によって既存のプロファイルから新しいプロファイル(および新しい動作)に切り替えて、新しいプロファイルをアクティブにしてアプリケーションコンテキストを更新することができます。あなたが適切なJNDIでJndiObjectFactoryBeanなど、すべての MQ関連の豆を定義することができます - あなたは春のカスタムスコープとJndiObjectFactoryBean http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html

2で詳細を取得することができます。これらの のBeanはカスタムスコープを使用して定義されており、 という条件付きを追加してScope#get()apiに適切なBeanを返すことができます。 http://javapapers.com/spring/custom-scope-for-spring-bean/

+0

残念ながら、未知数のプロファイルとスコープが未知数のMQ接続を構成および維持する方法を理解できません。 –

+0

より正確なコード例を追加します。 –