SpringJMS DMLC消息在重新启动之前不会被拾取
我正在使用DMLC收听Tibco EMS队列Tomcat。一段时间后,邮件将无法传递。重新启动后,将再次传递消息。我正在使用SingleConnectionFactorySpringJMS DMLC消息在重新启动之前不会被拾取,spring,jms,tibco,Spring,Jms,Tibco,我正在使用DMLC收听Tibco EMS队列Tomcat。一段时间后,邮件将无法传递。重新启动后,将再次传递消息。我正在使用SingleConnectionFactory Connection Factory: <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate" ref="jndiTem
Connection Factory:
<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="${connectionQueueFactory}" />
<property name="cache" value="false"/>
<property name="lookupOnStartup" value="false"/>
<property name="proxyInterface" value="javax.jms.ConnectionFactory"/>
</bean>
Authenticated Connection Factory:
<bean id="authenticationConnectionFactory"
class="com.my.service.AuthenticationConnectionFactory"> <-- extends SingleConnectionFactory
<property name="targetConnectionFactory" ref="jmsConnectionFactory" />
<property name="username" value="${userName}" />
<property name="password" value="${password}" />
<property name="sessionCacheSize" value="1"/>
</bean>
Destination Resolver:
<bean id="destinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="cache" value="true"/>
</bean>
Container:
<jms:listener-container concurrency="10-15" container-type="default"
connection-factory="simpleAuthenticationConnectionFactory"
destination-type="queue"
cache="consumer"
prefetch="1"
destination-resolver="destinationResolver"
acknowledge="transacted">
..... listeners.....
</jms:listener-container>
谢谢。acknowledge=如果在处理过程中引发异常,Transaction将不会确认消息,这可能导致此行为,因为EMS守护程序认为您的应用程序仍在忙于处理已传递但未确认的消息
然而,Transactived也是在抛出异常时保证重新传递的唯一确认模式
这意味着,除非您的应用程序正在关闭,否则您不能让异常被抛出,这可能是一个真正的痛苦。我已经在一篇文章中涵盖了各种选项。简短的版本是:
丢弃消息并忽略错误;
将消息和/或错误发送到由人员监控的错误日志或队列;
将消息和/或错误发送到由发送应用程序处理的错误队列。
所有这些选项都有问题,这就是为什么,但在您的情况下,您可能会发现选项2最实用。Tom,谢谢您的回答。但是,我不会在我的侦听器中抛出异常。我捕获异常,并根据异常类型,使用会话感知消息侦听器提交会话或回滚会话。请尝试侦听$sys.monitor消息,以查看EMS守护进程认为正在发生什么。要么它没有收到确认,要么会话没有正确回滚。