自定义 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
负责路由回复,但我推荐上面的第一个解决方案。
首先,我是 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
负责路由回复,但我推荐上面的第一个解决方案。