自定义 MessageListener 到 DefaultMessageListenerContainer 被覆盖

Posted

技术标签:

【中文标题】自定义 MessageListener 到 DefaultMessageListenerContainer 被覆盖【英文标题】:Custom MessageListener to DefaultMessageListenerContainer being overridden 【发布时间】:2015-10-19 16:50:12 【问题描述】:

首先,我是 Spring Integration 和 Spring JMS 方面的新手,所以我尝试采用的解决方案可能不适合我的要求。

我将尝试解释我需要实现什么:基本上,我需要将一条消息放入一个队列并异步等待另一个队列中的答案。

1.将消息放入队列:

我的解决方案:

<int-jms:outbound-gateway id="sendMessageOutboundGW"
                        connection-factory="jmsGatewayConnectionFactory"
                        request-channel="marshaledSendMessageJmsRequestChannel"
                        request-destination="sendMessageRequestQueue"
                        requires-reply="false"
                        reply-destination="sendMessageResponseQueue" 
                        correlation-key="JMSCorrelationID">
</int-jms:outbound-gateway>

--> 这很好,我可以看到消息被放入队列中

2。异步监听来自另一个队列的回复消息:

我的解决方案 1:

<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsGatewayConnectionFactory" />
<property name="destination" ref="sendMessageResponseQueue" />
<property name="messageListener" ref="messageListener" />
<property name="errorHandler" ref="sendMessageResponseErrorHandler" />
</bean>

<int-jms:message-driven-channel-adapter id="sendMessageInboundGW"
                                      container="messageListenerContainer"
                                      channel="sendMessageJmsResponseChannel" />

自定义 MessageListener 实现 javax.jms.MessageListener。

但是,我为 messageListenerContainer 设置的消息侦听器似乎被覆盖,而是使用了 org.springframework.integration.jms.ChannelPublishingJmsMessageListener。我可以在日志中看到收到的消息正在被 messageListenerContainer 拾取。

此外,使用此解决方案,我可以在日志中看到以下 WARN 消息 提供的侦听器容器已经有一个 MessageListener 实现,但它会被提供的 ChannelPublishingJmsMessageListener 覆盖。

我的解决方案 2:

<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsGatewayConnectionFactory" />
<property name="destination" ref="sendMessageResponseQueue" />
<property name="messageListener" ref="messageListener" />
<property name="errorHandler" ref="sendMessageResponseErrorHandler" />
</bean>

<int-jms:inbound-gateway id="sendMessageInboundGW"
                       container="messageListenerContainer"
                       request-channel="sendMessageJmsResponseChannel"
                       request-destination="sendMessageResponseQueue"
                       correlation-key="JMSCorrelationID" />

我对这个解决方案有同样的问题——自定义 MessageListener 被覆盖了。

未使用自定义 MessageListener,我收到以下错误:

org.springframework.messaging.core.DestinationResolutionException:没有可用的输出通道或replyChannel标头

我做错了什么?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

当使用 Spring Integration 时,消息监听器入站网关。这就是您的侦听器 bean 被覆盖的原因。

有几种解决方案

不要将监听器连接到容器中,而是配置&lt;service-activator/&gt; 来调用您的 POJO。回复将被路由到网关并作为回复发送到入站网关。

完全消除入站网关并自己处理消息 - 使用 MessageListenerAdapter,将您的类设为 POJO,适配器将路由回复。

如果您不想使用MessageListenerAdapter,则您的MessageListener 负责路由回复,但我推荐上面的第一个解决方案。

【讨论】:

加里,谢谢你的解释!现在对我来说很清楚了!我选择使用 MessageListenerAdapter,它工作得很好。

以上是关于自定义 MessageListener 到 DefaultMessageListenerContainer 被覆盖的主要内容,如果未能解决你的问题,请参考以下文章

asmack 中的 MessageListener 以集成无法绑定到任何小部件的 facebook 聊天

aSmack MessageListener 的 processMessage 永远不会被调用

从 JMS MessageListener 发出回滚信号

如何在 JMS 中使用带有 MessageListener 的消息转换器?

我无法在 smack android 的 MessageListener 方法中接收离线消息

Spring AMQP 源码分析 04 - MessageListener