首先,如果您在应用程序中插入 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>
之后,您可以使用注册表中的目标在动态路由器的端点上指定сonnectionFactory属性:
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 注册表项与应用程序上下文绑定,但我没有找到。