java - Spring 监听器未拾取 JMS 消息

标签 java spring jboss jms hornetq

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

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

首先摘自Spring的applicationContext.xml:

连接工厂和队列的 JNDI 名称与 JBoss 的 standalone-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) {
    //...
}

最佳答案

默认情况下,Spring 将 DynamicDestinationResolver 用于监听器容器,因此它希望在监听器的目标属性中接收 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>

关于java - Spring 监听器未拾取 JMS 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22416805/

相关文章:

java - 为什么 Java 代码在调试器中变慢?

java - 带有字段和文件上传

java - 如何将 Canvas 复制到位图中

java - Spring Boot 测试@Transactional 不保存

ssl - JBoss 5 - CA 签名证书导致 java.io.IOException : excess private key

java - JBoss JMS 提供商

java - 在 java 程序中发出 STARTTLS 命令后,startHandshake 出现不支持或无法识别的 ssl 消息异常

java - 如何使用adapter.notifyDataSetChanged();我必须使用这些行来解决我的错误

java - 自动启动 Spring 应用程序

java - 使用 spring 和 tomcat 从 xml 文件中接受数据