jms – Spring DefaultMessageListenerContainer – 侦听器不在Websphere MQ上读取消息

我使用Spring 3.0 – DefaultMessageListenerContainer连接到Websphere 6 MQ. MQ上已经存在一些消息.当我运行我的测试时,启动实现SessionAwareMessageListener的侦听器.但是onMessage()没有被调用.所以问题是不会读取队列中已有的消息.

根据文档,默认情况下autoStartup为true(我没有更改过).根据我的underatanding,在启动时,监听器应该为任何现有消息读取队列,并且应该调用onMessage().如果这种理解是错误的,请告诉我.

以下是配置文件中的代码段:

    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsQueueConnectionFactory" />
        <property name="destinationName">
            <value>${queue}</value>
        </property>
        <property name="messageListener" ref="exampleMessageListener" />
        <property name="concurrentConsumers" value="1" />
        <property name="maxConcurrentConsumers" value="1" />
        <property name="idleTaskExecutionLimit" value="4" />
        <property name="maxMessagesPerTask" value="4" />
        <property name="receiveTimeout" value="5000" />
        <property name="recoveryInterval" value="5000" />
        <property name="sessionTransacted" value="true" />
        <property name="transactionManager" ref="jmsTransActionManager" />
    </bean> 

注意:没有错误/异常,测试应用程序启动就好了.

任何解决这个问题的指针都会有很大的帮助.

谢谢,
RJ

最佳答案
问题得到解决.在侦听器获取消息之后但在它可以将消息显示为输出之前,测试类正在终止.所以第一条消息(最高优先级的消息)从队列中丢失了.

后来因为我已经包含了一个事务管理器,所以监听器将消息放回到队列中(由于侦听器容器在此期间被停止,因此显示警告为拒绝接收消息).由于这是一个警告并且我的记录器处于调试级别,我之前错过了这个.

在测试类中放置一个thread.sleep,确保它运行的时间更长,并且监听器可以按优先级顺序读取队列中的所有消息:)

干杯,
RJ

转载注明原文:jms – Spring DefaultMessageListenerContainer – 侦听器不在Websphere MQ上读取消息 - 代码日志