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