我的任务包括3个步骤prepare
,execute
,update
。 prepare
和update
需要在交易中工作,而execute
需要很长时间(即几分钟到几小时)。该任务是EJB的一部分,即:
@Stateless
public class Task {
public void doTask() {
prepare();
execute();
update();
}
}
我的问题是,是否有一种(优雅)方式在prepare
之后提交并完成交易并在update
之前开始新的交易?我宁愿使用容器管理的事务,也可能不会切换到使用UserTransaction
。
如果获得任何优势,可以将任务拆分为单个EJB,但请注意暂停execute
的事务(即使用@Transactional(TxType.NOT_SUPPORTED)
是不够的,因为这仍然会触发超时。< / p>
我尝试将其拆分为TaskExecute
类,其中包含@Asynchronous @Transactional(NOT_SUPPORTED) public void execute()
并在完成后发送事件。但这似乎也不起作用。
有办法做到这一点吗?
经过一些进一步的测试后,让我得出结论:Alexanders的回复是绝对正确的。我的理解必须改变。最重要的是,我不知道@Transactional
不适用于EJB,而只适用于CDI bean。对于EJB,注释称为@TransactionAttribute
,可以设置为基本相同的值。 @Asynchronous
和@TransactionAttribute(NOT_SUPPORTED)
的组合确实有效(如果不等待结果)。
答案 0 :(得分:1)
这取决于您要使用的Java EE版本。以下是三种可能的解决方案。
execute
(任何版本,但需要完整的配置文件)execute
(@Timeout
)后者可能正是您所寻找的,但仅适用于Java EE 7.0及更高版本。否则,JMS解决方案是最干净的,但如果JMS不是一个选项,定时服务应该可以工作。