自定义 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 被覆盖的原因。
有几种解决方案
不要将监听器连接到容器中,而是配置<service-activator/>
来调用您的 POJO。回复将被路由到网关并作为回复发送到入站网关。
完全消除入站网关并自己处理消息 - 使用 MessageListenerAdapter
,将您的类设为 POJO,适配器将路由回复。
如果您不想使用MessageListenerAdapter
,则您的MessageListener
负责路由回复,但我推荐上面的第一个解决方案。
【讨论】:
加里,谢谢你的解释!现在对我来说很清楚了!我选择使用 MessageListenerAdapter,它工作得很好。以上是关于自定义 MessageListener 到 DefaultMessageListenerContainer 被覆盖的主要内容,如果未能解决你的问题,请参考以下文章
asmack 中的 MessageListener 以集成无法绑定到任何小部件的 facebook 聊天
aSmack MessageListener 的 processMessage 永远不会被调用
如何在 JMS 中使用带有 MessageListener 的消息转换器?