0

在我的集线器系统中,我希望能够与其他节点的动态列表进行通信。我将在每个系统上都有一个代理和一个静态队列名称。因此,我可以通过定位其代理来处理每个节点。我有一些工作,使用每个目的地的端点,但骆驼 JMS 文档暗示这不是一个好主意。我可能会有不到 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>

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

于 2013-06-25T14:37:16.040 回答