Spring侦听器未捕获JMS消息

时间:2014-03-14 22:21:04

标签: java spring jboss jms hornetq

我在一个独立的JBoss EAP 6.2(带有嵌入式HornetQ提供程序)中运行了一个Spring应用程序。

消息被无意中放入队列(我可以在jboss-eap-6.2 \ standalone \ data \ messagingjournal \ hornetq-data-1.hq中看到它们,因为队列是持久的),但是听不到(监听器内的断点未被击中)。我怀疑配置中缺少或错误但看不清楚是什么。 JBoss启动时没有任何验证错误。

首先,摘自Spring的applicationContext.xml:

连接工厂和队列的JNDI名称与JBoss'中的名称相匹配。独立-full.xml

<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="java:/JmsXA" resource-ref="false" proxy-interface="javax.jms.ConnectionFactory"/> 

<jee:jndi-lookup id="myQueue" jndi-name="java:jboss/exported/jms/queue/myQueue"/> 

<bean id="myHandler" class="com.example.MyHandler" />

<jms:listener-container destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory">
    <jms:listener destination="java:jboss/exported/jms/queue/myQueue" ref="myHandler" method="processMessage" />
</jms:listener-container>

消息处理程序被声明为Spring组件,类和方法名称与上面声明的名称匹配:

@Component
public class MyHandler {

public void processMessage(MyMessage delaySendTransfer) {
    //...
}

1 个答案:

答案 0 :(得分:3)

默认情况下,Spring使用DynamicDestinationResolver作为侦听器容器,因此它希望在侦听器的destination属性中接收bean引用。由于您使用的是JNDI名称,因此您应将目标解析器策略设置为jndiDestinationResolver

<jms:listener-container destination-resolver="jndiDestinationResolver" destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory">
    <jms:listener destination="java:jboss/exported/jms/queue/myQueue" ref="myHandler" method="processMessage" />
</jms:listener-container>

使用bean引用替换目标属性值也应该可以解决问题:

<jms:listener-container destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory">
    <jms:listener destination="myQueue" ref="myHandler" method="processMessage" />
</jms:listener-container>