Tibco&x2B;TransactionRolledBackException上带有ErrorHandler的Spring JMS行为
我想澄清通过Spring(4.1)JMS配置使用的Tibco总线(6.1)的行为——指定了和未指定ErrorHandler,以及TransactionRolledBackException的特定情况 我将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-
<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>
每个用例将发生什么?以下是我的猜测:
- 在什么情况下Spring会抛出org.springframework.jms.TransactionRolledBackException
- TransactionRolledBackException的处理是否与任何其他运行时异常不同
MarinaSpring 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);
}
}