自定义 MessageListener 到 DefaultMessageListenerContainer 被覆盖

Custom MessageListener to DefaultMessageListenerContainer being overridden

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

我将尝试解释我需要实现的内容:基本上,我需要在 queue 中放置一条消息并在另一个 queue 中异步等待答案。

1。在 queue:

中留言

我的解决方案:

<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>

--> 这工作正常,我可以看到消息被放置在 queue

2。异步监听来自另一个 queue:

的回复消息

我的方案一:

<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 覆盖。

我的方案二:

<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: 没有 output-channel 或 replyChannel header 可用

我做错了什么?

如有任何帮助,我们将不胜感激。

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

有几种解决方案

  • 不要将侦听器连接到容器中,而是配置 <service-activator/> 来调用您的 POJO。回复将路由到网关并作为回复发送到入站网关。

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

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