gpt4 book ai didi

java - session bean 内的 ejb3 隔离(自治)事务

转载 作者:行者123 更新时间:2023-12-01 05:19:02 26 4
gpt4 key购买 nike

我正在使用 XA(两阶段)事务。我想通过日志类和实体管理器记录到一个日志表。我在 EJB Session bean 中的方法如下所示:

private void logError(Throwable throwable) {
LogEntity logEntity = new LogEntity();
// Set everything
entityManager.persist(logEntity);
}

我希望它处于独立于任何“外部”事务的独立(自治)事务中。我已经尝试在方法名称之前添加 @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED) 但不起作用。

在调用 EJB3 方法之前,我创建用户事务,例如:

try {
UserTransaction transaction = (UserTransaction)context.lookup("javax.transaction.UserTransaction");
transaction.begin();
// Call EJB3 method
transaction.commit();
} catch (Throwable t) {
t.printStackTrace();
try {
transaction.rollback();
} catch (SystemException e) {
e.printStackTrace();
}
}

无论提交是否完成,我都想记录。怎么做?

问候

最佳答案

事务属性仅在通过代理调用时才相关。它们不适用于直接调用,其中包括私有(private)方法。尝试类似以下的操作(它使用 EJB 3.1 无接口(interface) View ,但如果您只有 EJB 3.0,则可以创建一个单独的本地接口(interface)来进行日志记录):

@Stateless
@Local(BusinessInterface.class)
@LocalBean
public class MyBean {
@EJB MyBean logger;

@TransactionAttribute(REQUIRED)
public void businessMethod() {
try {
...
} catch (Throwable t) {
logger.logError(t);
...
}
}

@TransactionAttribute(NOT_SUPPORTED)
public void logError(Throwable t) {
...
}
}

重要的是,对 logError 的调用是通过注入(inject)的 EJB 代理进行的,这允许容器在 logError 方法期间控制暂停 XA 事务。

关于java - session bean 内的 ejb3 隔离(自治)事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718360/

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