SpringJMS DMLC消息在重新启动之前不会被拾取

SpringJMS 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

我正在使用DMLC收听Tibco EMS队列Tomcat。一段时间后,邮件将无法传递。重新启动后,将再次传递消息。我正在使用SingleConnectionFactory

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守护进程认为正在发生什么。要么它没有收到确认,要么会话没有正确回滚。