You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java标准库中替代org.jboss.ejb3.annotation.TransactionTimeout的注解方案

问题解答

Java标准库(以及Jakarta EE标准规范)中没有直接对应JBoss @TransactionTimeout的事务超时管理注解,但可以通过以下两种标准方式实现事务超时控制,避免依赖第三方专有注解:

1. 编程式事务控制(通过UserTransaction)

直接在方法中使用UserTransaction手动设置事务超时并管理事务生命周期,这是Java EE标准支持的方式:

import javax.ejb.AccessTimeout;
import javax.ejb.Schedules;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.transaction.UserTransaction;
import javax.inject.Inject;
import java.util.concurrent.TimeUnit;

@Startup
@Singleton
@AccessTimeout(value = 10, unit = TimeUnit.MINUTES)
public class CustomerTeamsScheduler {

  @Inject
  private UserTransaction userTransaction;

  @Schedules ({
    @Schedule(hour = "13", minute = "00", persistent = false),
    @Schedule(hour = "23", minute = "00", persistent = false)
  })
  public void schedule() {
    try {
      // 将20小时转换为秒,UserTransaction.setTransactionTimeout接受秒数参数
      userTransaction.setTransactionTimeout((int) TimeUnit.HOURS.toSeconds(20));
      userTransaction.begin();
      
      // 执行你的业务逻辑代码
      
      userTransaction.commit();
    } catch (Exception e) {
      try {
        if (userTransaction.getStatus() == javax.transaction.Status.STATUS_ACTIVE) {
          userTransaction.rollback();
        }
      } catch (Exception rollbackEx) {
        rollbackEx.printStackTrace();
      }
      e.printStackTrace();
    }
  }
}

2. 通过EJB部署描述符(ejb-jar.xml)配置

使用标准的EJB部署描述文件,为指定方法配置事务超时,无需修改Java代码:

<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.2">
  <enterprise-beans>
    <session>
      <ejb-name>CustomerTeamsScheduler</ejb-name>
      <ejb-class>com.yourpackage.CustomerTeamsScheduler</ejb-class>
      <session-type>Singleton</session-type>
      <transaction-type>Container</transaction-type>
      <container-transaction>
        <method>
          <ejb-name>CustomerTeamsScheduler</ejb-name>
          <method-name>schedule</method-name>
        </method>
        <trans-attribute>Required</trans-attribute>
        <timeout>72000</timeout> <!-- 20小时,单位为秒 -->
      </container-transaction>
    </session>
  </enterprise-beans>
</ejb-jar>

这两种方式都属于Java EE标准范畴,不会绑定到Wildfly/JBoss特定实现,能提升代码的跨容器可移植性。

内容的提问来源于stack exchange,提问作者fatherazrael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:12:07