【问题标题】:Loop inside @Schedule with new transactions [duplicate]使用新事务在@Schedule 内循环[重复]
【发布时间】:2017-09-14 00:28:50
【问题描述】:

我使用带有@scheduled 注释的EJB 每10 秒循环一次我的所有上下文实体。所有 Contexts 实体彼此无关,因此应为其更新方法创建新事务:

@Stateless
public class UpdateService {

    @EJB
    ContextDao contextDao;

    @Schedule(second = "*/10", minute = "*", hour = "*")
    public void update() {
        for(ContextEntity context : contextDao.findAllContexts()) {
            updateContext(context);
        }
    }

    public void updateContext(ContextEntity context) {
         // load data from db
         // update some stuff
         // save back to db
    }
}

现在我想为 updateContext 方法创建一个事务。因此,如果我在一个 ContextEntity 中遇到任何错误,则只有该事务应该回滚,而不是整个循环。

  1. update 和 updateContext 的正确 TransactionAttributes 是什么?
  2. 是否必须为 updateContext 方法使用不同的 EJB?

谢谢

【问题讨论】:

  • 这是一个很好且有用的描述,但我不会找到它。我会寻找 nestedembedded 调用 same EJB 或其他东西。或许可以改名

标签: jakarta-ee transactions ejb scheduled-tasks


【解决方案1】:

我假设您想在循环内调用 updateContext 而不是 update

定义的update-方法具有TransactionAttributeType.REQUIRED 属性,这是默认属性,可以保持不变。

updateContext-方法应该注解为TransactionAttributeType.REQUIRES_NEW,但是...如果你想在那个事务上下文中调用,你必须使用

@Resource
SessionContext sessionContext;

并从 sessionContext 中获取业务接口以调用 updateContext

例如查看SingletonEjb 参见方法methodCallUsingSessionContext

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多