gpt4 book ai didi

java - 在 EJB 中处理 TransactionTimeout 异常

转载 作者:行者123 更新时间:2023-11-29 08:09:37 25 4
gpt4 key购买 nike

我有一个名为 methodA() 的 EJB 方法调用另一个名为 methodB() 的 EJB 方法,该方法启动一个新的容器管理的事务。在 methodB 中,我强制执行事务超时,该事务超时被 caughtB 正确捕获并且未传播到 methodA。但令我惊讶的是 methodA 收到了异常。我在这里遗漏了什么吗?

methodA() {
try {
methodB();
System.out.println("print me!");
} catch(Exception e) {
System.out.println("shouldn't be here");
}
}

@TransactionTimeout(5) //5 sec timeout
methodB() {
try {
Thread.sleep(6000);
} catch(Throwable t) {
System.out.println("Eating all the Exception..");
}
}

第一个方法应该永远不会捕捉到异常(EJBTransactionTimeoutException),因为方法 B 已经吃掉了它。我看到的是“不应该在这里”的输出,而不是“打印我!”。这让我想知道容器是否在 methodB 完成后立即抛出另一个 EJBTransactionTimeoutException 异常,尽管它已经抛出了 Timeout 异常?

最佳答案

Thread.sleep() 从不抛出 TransactionTimeoutException,因此此 catch block 无法捕获此异常。

当 EJB A 从 EJB B 调用 methodB 时,它不会直接调用 bean 方法。它在代理上调用 methodB。该代理负责处理事务管理、安全性等,然后在您的 bean 实例上调用实际的 methodB。

所以异常不会从 methodB 中抛出。它从包装 EJB B 的代理调用,并在包装​​的 bean 实例的 methodB 返回时抛出 TransactionTimeoutException,并且执行时间超过配置的超时时间。

关于java - 在 EJB 中处理 TransactionTimeout 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com