4

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

根据文档, autoStartup 默认为 true(我没有更改此设置)。根据我的理解,在启动时,侦听器应该读取队列中的任何现有消息,并且应该调用 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

4

2 回答 2

1

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

后来,由于我包含了事务管理器,监听器将消息放回队列(显示警告为Rejecting received message because the listener container has been stopped in the time)。由于这是一个警告并且我的记录器处于调试级别,所以我之前错过了这个。

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

干杯,
RJ

于 2011-11-15T05:22:22.540 回答
0

这实际上不是答案,但我不想为同样的问题创建新问题。

我初始化了 Spring 上下文

ctx = new ClassPathXmlApplicationContext("classpath:" + args[0]);

读取配置,然后调用(因为警告资源未关闭):

ctx.stop();

我没有意识到它会停止我的豆子,经过一天的调试,我在日志中发现了这条消息

DEBUG o.s.c.s.DefaultLifecycleProcessor - Asking bean 'messageListenerContainer' of type [class org.springframework.jms.listener.DefaultMessageListenerContainer] to stop
于 2014-01-17T12:42:24.103 回答