如何将自定义 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。