【发布时间】:2017-10-07 07:33:12
【问题描述】:
我正在使用 Spring 与 ActiveMQ 的集成。当我的队列为空时(不再有待处理的消息),我需要做一些处理。我已经实现了这样的目标,
package my.com.spring.integration;
public class MyListenerContainer extends DefaultMessageListenerContainer {
@Override protected void messageReceived(Object invoker, Session session) {
// I mark lastMessageReceived time here
super.messageReceived(invoker, session);
}
@Override protected void noMessageReceived(Object invoker, Session session) {
// I wait for 1 minute from last message messageReceived and after
// that I consider that queue has no more messages now and
// I start my stuff
super.noMessageReceived(invoker, session);
}
}
而我的 spring xml 看起来像这样,
<bean id="my.jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61616?jms.prefetchPolicy.queuePrefetch=250&jms.useAsyncSend=true" />
<property name="optimizeAcknowledge" value="true" />
</bean>
<bean id="my.jms.cachedConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory"
p:targetConnectionFactory-ref="my.jmsConnectionFactory"
p:sessionCacheSize="10" p:reconnectOnException="true" />
<bean id="myListenerContainer "
class="my.com.spring.integration.MyListenerContainer ">
<property name="connectionFactory"
ref="my.jms.cachedConnectionFactory" />
<property name="destination" ref="myQ" />
<property name="concurrentConsumers" value="1" />
<property name="maxConcurrentConsumers" value="1" />
</bean>
<bean id="myMessageListener"
class="org.springframework.integration.jms.ChannelPublishingJmsMessageListener" />
<bean id="myJmsEndpoint"
class="org.springframework.integration.jms.JmsMessageDrivenEndpoint">
<constructor-arg ref="myListenerContainer" />
<constructor-arg ref="myMessageListener" />
<property name="outputChannel" ref="myConsumerChannel" />
</bean>
到目前为止一切正常。当队列为空并且我能够做我想要的事情时,我会收到通知。
问题:除了队列为空之外,还有任何其他原因不再接收消息吗?就像在 Spring 代码执行中发生任何异常一样,会发生什么?这是实现我的目的的正确方法吗?如果没有,我该如何改进?
【问题讨论】:
标签: spring jms spring-integration activemq message-queue