我有一个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名称吗?
答案 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的目的地。