如何将自定义 MessageListener 添加到现有消息驱动的通道适配器
How to add a custom MessageListener to existing message driven channel adapter
我正在尝试将消息侦听器添加到我的消息驱动通道适配器(以便从通过它的消息中读取一些 headers)。
doc 听起来我必须引用 messageListenerContainer 并向其添加 messageListener。为了得到消息,我添加了自己的 messageListener。
(xml) 实现的相关部分如下所示:
<bean id="myOwnMessageListener" class="com.my.project.MyOwnMessageListener">
</bean>
<bean id="myListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer" >
<!-- <bean id="myListener" class="com.my.project.MyOwnMessageListenerContainer" > -->
<property name="messageListener" ref="myOwnMessageListener"/>
<property name="autoStartup" value="false" />
<property name="connectionFactory" ref="connectionFactoryCaching" />
<property name="destination" ref="jmsQueue" />
<property name="maxMessagesPerTask" value="1" />
<property name="receiveTimeout" value="1" />
<property name="backOff" ref="fixedBackOff" />
<property name="sessionTransacted" value="true"/>
<property name="concurrentConsumers" value="${INBOUND_CONSUMERS}"/>
<property name="maxConcurrentConsumers" value="${INBOUND_MAX_CONSUMERS}"/>
<property name="errorHandler" ref="connectionJmsError"/>
<property name="exceptionListener" ref="connectionJmsException"/>
</bean>
<int-jms:message-driven-channel-adapter id="jmsIn" container="myListener" channel="channelJms_Jms" error-channel="myErrorChannel"/>
来自 MyOwnMessageListener :
public class MyOwnMessageListener implements javax.jms.MessageListener {
private static final Logger LOG = LoggerFactory.getLogger(MyOwnMessageListener.class);
@Override
public void onMessage(Message message) {
LOG.debug("onMessage called...")
}
}
我的 pb 是从未使用过 MessageListener:既没有调用构造函数也没有调用消息处理程序。
我也尝试过实现自己的 MessageListenerContainer,但也没有调用它的构造函数。
当我使用调试模式(在 Eclipse 下)时,我看到一个名为“MyListener”的线程,其名称显示数字增长得非常快:这看起来 stg 在我的配置中不太好....
但是到目前为止,我无法理解这里出了什么问题。
doc 中有很多信息,但由于我对 spring-integration 和面向消息的中间件都是新手,我可能会错过那里的明显解决方案。
因此,如果有人可以在这里指出我的错误......那将有很大帮助!
由于您为该侦听器容器使用 <int-jms:message-driven-channel-adapter>
,因此它自己的 SessionAwareMessageListener
成为框架内部该容器内的侦听器。这意味着您自己的 myOwnMessageListener
被覆盖并且真正的侦听器工作发生,它没有被调用确实是一个事实,因为一切都通过 JmsMessageDrivenEndpoint
.[=17 委托给 ChannelPublishingJmsMessageListener
=]
您应该可以在订阅了 channelJms_Jms
的服务激活器中访问所需的 headers,其中提到的 ChannelPublishingJmsMessageListener
正在发布一条来自为您准备的 JMS 的消息。
关键是:如果您已经使用 Spring 集成,那么您必须依赖其模式和组件来处理消息。否则你需要退后一步,直接使用普通的 Spring JMS 及其容器和侦听器 API。
我正在尝试将消息侦听器添加到我的消息驱动通道适配器(以便从通过它的消息中读取一些 headers)。
doc 听起来我必须引用 messageListenerContainer 并向其添加 messageListener。为了得到消息,我添加了自己的 messageListener。
(xml) 实现的相关部分如下所示:
<bean id="myOwnMessageListener" class="com.my.project.MyOwnMessageListener">
</bean>
<bean id="myListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer" >
<!-- <bean id="myListener" class="com.my.project.MyOwnMessageListenerContainer" > -->
<property name="messageListener" ref="myOwnMessageListener"/>
<property name="autoStartup" value="false" />
<property name="connectionFactory" ref="connectionFactoryCaching" />
<property name="destination" ref="jmsQueue" />
<property name="maxMessagesPerTask" value="1" />
<property name="receiveTimeout" value="1" />
<property name="backOff" ref="fixedBackOff" />
<property name="sessionTransacted" value="true"/>
<property name="concurrentConsumers" value="${INBOUND_CONSUMERS}"/>
<property name="maxConcurrentConsumers" value="${INBOUND_MAX_CONSUMERS}"/>
<property name="errorHandler" ref="connectionJmsError"/>
<property name="exceptionListener" ref="connectionJmsException"/>
</bean>
<int-jms:message-driven-channel-adapter id="jmsIn" container="myListener" channel="channelJms_Jms" error-channel="myErrorChannel"/>
来自 MyOwnMessageListener :
public class MyOwnMessageListener implements javax.jms.MessageListener {
private static final Logger LOG = LoggerFactory.getLogger(MyOwnMessageListener.class);
@Override
public void onMessage(Message message) {
LOG.debug("onMessage called...")
}
}
我的 pb 是从未使用过 MessageListener:既没有调用构造函数也没有调用消息处理程序。
我也尝试过实现自己的 MessageListenerContainer,但也没有调用它的构造函数。
当我使用调试模式(在 Eclipse 下)时,我看到一个名为“MyListener”的线程,其名称显示数字增长得非常快:这看起来 stg 在我的配置中不太好.... 但是到目前为止,我无法理解这里出了什么问题。
doc 中有很多信息,但由于我对 spring-integration 和面向消息的中间件都是新手,我可能会错过那里的明显解决方案。
因此,如果有人可以在这里指出我的错误......那将有很大帮助!
由于您为该侦听器容器使用 <int-jms:message-driven-channel-adapter>
,因此它自己的 SessionAwareMessageListener
成为框架内部该容器内的侦听器。这意味着您自己的 myOwnMessageListener
被覆盖并且真正的侦听器工作发生,它没有被调用确实是一个事实,因为一切都通过 JmsMessageDrivenEndpoint
.[=17 委托给 ChannelPublishingJmsMessageListener
=]
您应该可以在订阅了 channelJms_Jms
的服务激活器中访问所需的 headers,其中提到的 ChannelPublishingJmsMessageListener
正在发布一条来自为您准备的 JMS 的消息。
关键是:如果您已经使用 Spring 集成,那么您必须依赖其模式和组件来处理消息。否则你需要退后一步,直接使用普通的 Spring JMS 及其容器和侦听器 API。