Tibco&x2B;TransactionRolledBackException上带有ErrorHandler的Spring JMS行为

Tibco&x2B;TransactionRolledBackException上带有ErrorHandler的Spring JMS行为,jms,spring-jms,tibco,Jms,Spring Jms,Tibco,我想澄清通过Spring(4.1)JMS配置使用的Tibco总线(6.1)的行为——指定了和未指定ErrorHandler,以及TransactionRolledBackException的特定情况 我将JMS侦听器配置为“事务处理”模式,如下所示: <jms:listener-container connection-factory="singleConnectionFactory"              acknowledge="transacted" task-

我想澄清通过Spring(4.1)JMS配置使用的Tibco总线(6.1)的行为——指定了和未指定ErrorHandler,以及TransactionRolledBackException的特定情况

我将JMS侦听器配置为“事务处理”模式,如下所示:

<jms:listener-container connection-factory="singleConnectionFactory"                 
     acknowledge="transacted" task-executor="myTaskExecutor" concurrency="${my.queue.concurrency}">
     <jms:listener destination="${queue.destination}" ref="myProcessor" method="processMyMessage" />
</jms:listener-container>
每个用例将发生什么?以下是我的猜测:

  • 不变
  • 无更改-此运行时异常被重新抛出,因此消息将不会被确认,并且最多会被重新传递2次
  • TransactionRolledBackException:当我在ErrorHandler中处理此异常时-这是在TX已经回滚(正如RolledBack的名称所示)并且消息被标记为not ACK’ed之后发生的吗?因此,导致它像案例2中那样重新交付?或者我是否通过接受此异常有效地导致此消息被确认
  • 还有几个问题:

    • 在什么情况下Spring会抛出org.springframework.jms.TransactionRolledBackException
    • TransactionRolledBackException的处理是否与任何其他运行时异常不同
    谢谢,


    Marina

    Spring JMS仅在底层JMS客户端引发
    javax.JMS.TransactionRolledBackException
    时才会引发该异常-它只是一个未经检查的包装异常-请参见
    JmxUtils.convertJmsAccessException()

    查看堆栈跟踪,您将看到它被抛出的位置/原因


    一般来说,也就是说,如果它是在容器会话中抛出的,捕获它不会有任何效果-事务已经回滚;但是堆栈跟踪是关键。

    谢谢,Gary。那么,您是说消息的实际回滚将取决于TransactionTolledBackException从何处抛出?我还不清楚此异常的处理(回滚或不回滚TX和ACK消息)是否与其他运行时异常(如OOM)的处理有任何不同。OOM是en
    Error
    不是异常(并且您无法真正“处理”它)。您需要查看堆栈跟踪以确定谁抛出了
    javax.jmx.TransactionRollbackException
    ;我不能推测。异常表示事务已经回滚,因此您对此无能为力(除非它在不同的JMS会话上)。
    <jms:listener-container connection-factory="singleConnectionFactory"                 
         acknowledge="transacted" task-executor="myTaskExecutor" concurrency="${my.queue.concurrency}"
    error-handler="myErrorHandler">
         <jms:listener destination="${queue.destination}" ref="myProcessor" method="processMyMessage" />
    </jms:listener-container>
    
    import org.springframework.jms.TransactionRolledBackException;
    import org.springframework.util.ErrorHandler;
    public class JMSListenerErrorHandler implements ErrorHandler {
        @Override
        public void handleError(Throwable t) {
            if (t.getCause() instanceof TransactionRolledBackException) {
                log.warn("JMS transaction rollback; reason: " + t.getMessage(), t);
            } else {
                log.error(t.getMessage(), t);
                throw new RuntimeException(t);
            }
        }