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
相关产品推荐
相关产品推荐

