我想澄清通过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>
并将队列的'maxRedelivery'设置为2。
以下是在myProcessor.processMyMessage()中处理事件的场景:
现在,我正在添加一个显式的ErrorHandler来更好地记录一些运行时异常:
<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>
以下是ErrorHandler的实现,我们吞下TransactionRolledBackException:
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);
}
}
每个用例会发生什么?这是我的猜测:
还有更多问题:
谢谢,
码头
答案 0 :(得分:1)
当底层JMS客户端抛出javax.jms.TransactionRolledBackException
时,Spring JMS仅抛出该异常 - 它只是一个未经检查的包装器异常 - 请参阅JmxUtils.convertJmsAccessException()
。
查看堆栈跟踪,您将看到它被抛出的位置/原因。
一般情况下,即如果它被丢弃在容器的会话中,捕获它就不会产生任何影响 - 该事务已经回滚;但堆栈跟踪是关键。