まず、アプリケーションに 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 レジストリ エントリをアプリケーション コンテキストにバインドする簡単な方法があるかもしれませんが、私はそれを見つけられませんでした。