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

时间:2011-11-14 11:26:36

标签: jms listener spring-jms

我使用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

2 个答案:

答案 0 :(得分:1)

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

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

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

欢呼声,
RJ

答案 1 :(得分:0)

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

我初始化了Spring上下文

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

读取配置然后调用(因为没有关闭reasource的警告):

ctx.stop();

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

DEBUG o.s.c.s.DefaultLifecycleProcessor - Asking bean 'messageListenerContainer' of type [class org.springframework.jms.listener.DefaultMessageListenerContainer] to stop