从Spring查找activeMQ目的地

时间:2012-03-21 16:49:40

标签: java spring jms jndi activemq

我有一个Spring应用程序需要查找JMS目标才能完成它的工作。根据我们是在开发还是系统测试环境中,我们将使用不同的JMS实现。 (使用WebLogic进行系统测试的Oracle AQ,在Jetty for Dev中部署的Apache ActiveMQ)

我已经配置了ActiveMQ并将其部署得很好,并在activemq.xml文件中创建了它的目标:

<destinations>
    <queue physicalName="handlersDest" />
    <topic physicalName="notificationsDest" />
</destinations>

当我启动我的处理程序(Spring)应用程序时,它会查找目标:

<jee:jndi-lookup id="handlersDest"  jndi-name="$handlersDest">
    <jee:environment>
        java.naming.factory.initial = ${jndi.jms.naming.factory.initial}
        java.naming.provider.url = ${jndi.jms.naming.url}
        queue.handlersDest = handlersDest
    </jee:environment>
</jee:jndi-lookup> 

我的问题是我必须在环境中添加以下行才能使其正常工作:

queue.handlersDest = handlersDest

我知道这告诉ActiveMQ的初始上下文,有一个名为“handlersDest”的目的地,它应该确保它在队列名称“handlersDest”下注册,但我不知道为什么我需要在客户端中执行此操作应用

我不能在activemq.xml或我的应用程序中部署activemq的其他地方预定义这些JNDI名称吗?

1 个答案:

答案 0 :(得分:0)

答案是否定的,active-MQ初始上下文不支持预测目的地的jndi名称。

我通过将jndi设置配置为属性来解决问题,以便在使用不需要进一步配置jndi的其他提供程序时将其设置为空白。

例如:

<jee:jndi-lookup id="handlersDest"  jndi-name="$handlersDest">
    <jee:environment>
        java.naming.factory.initial = ${jndi.jms.naming.factory.initial}
        java.naming.provider.url = ${jndi.jms.naming.url}
        queue.handlersDest = handlersDest
    </jee:environment>
</jee:jndi-lookup> 

变为:

<jee:jndi-lookup id="handlersDest"  jndi-name="$handlersDest">
    <jee:environment>
        java.naming.factory.initial = ${jndi.jms.naming.factory.initial}
        java.naming.provider.url = ${jndi.jms.naming.url}
        ${jndi.config}
    </jee:environment>
</jee:jndi-lookup> 

这样,当使用active-mq部署时,我可以将jndi.config属性指定为“queue.handlersDest = handlersDest”。但是在不需要时可以将值留空。

另一个答案是不使用active-mqs初始上下文,而是使用容器提供的初始上下文,该容器可以配置为包含来自active-mq的目的地。