0

ハブ システムから、他のノードの動的リストと通信できるようにしたいと考えています。各システムにブローカーを配置し、静的キュー名を設定します。したがって、ブローカーをターゲットにすることで、各ノードに対処できます。宛先ごとにエンドポイントを使用して何かが機能していますが、Camel JMS docはそれが良い考えではないことを示唆しています。おそらく 100 未満のエンドポイントしかありませんが、より良い方法があるかどうかを知りたいと思っています。

ブローカ URI をエンドポイント URI の一部として指定できれば、動的受信者リストは完璧ですが、その方法がわかりません。

単一の中央ブローカーを使用し、そこから他のノードを取得する方がおそらく賢明ですが、これらのノードを中央の場所で構成する必要がないという要件があります. したがって、メッセージは収集するのではなく、送信する必要があります。

前もって感謝します。

4

1 に答える 1

2

まず、アプリケーションに JNDI レジストリをプラグインすると、より簡単になります。Apache ActiveMQ には、統合された軽量の JNDI プロバイダーがすでに付属しています。または、アプリ サーバーの JNDI または別の軽量実装を使用することもできます。次に、このレジストリにブローカーの宛先 (ConnectionFactory インスタンス) を入力します。

コンテキストで JndiTemplate を初期化します。

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
    <props>
            <prop key="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop>
            <prop key="java.naming.provider.url">tcp://localhost:61616</prop>
    </props>
    </property>
</bean>

その後、レジストリの宛先を使用して、動的ルーターのエンドポイントにсconnectionFactoryプロパティを指定できます。

public class FooDynamicRouter {

  private AbstractApplicationContext ctx;
  private JndiTemplate jndiTemplate;

  @Consume(uri = "activemq:outgoing")
  @DynamicRouter
  public String route(@XPath("/destination/code") String code, Document body) {
     if (code != null) {
       if (!ctx.containsBean("cf"+code)) {
          ctx.getBeanFactory().registerSingleton("cf"+code, jndiTemplate.lookup("cf"+code));
       }    
       return "jms:queue:foo?connectionFactory=cf"+code;
     } else {
       return null;
     }
  }
}

実行時に JNDI レジストリ エントリをアプリケーション コンテキストにバインドする簡単な方法があるかもしれませんが、私はそれを見つけられませんでした。

于 2013-06-25T14:37:16.040 に答える