暂停交易超时吗?

时间:2018-03-09 08:52:26

标签: java-ee jboss transactions ejb-3.0 java-ee-7

我有一个在JBOSS EAP 7上运行的JEE应用程序。有一个长期运行的异步方法,它将数据导入另一个系统。触发后,它会在5分钟后遇到事务问题,即JBOSS默认事务超时。到现在为止还挺好。我改变了行为(伪代码):

Before:
@Transactional(Required) //which is default
//The whole process takes usually longer than 5 min
void doImport{
 for(n-number of datsets){
   importOneDataSet();
 }
}

After:
@Transactional
void doImport{
 for(n-number of datsets){
   importOneDataSet();
 }
}
...
@Transactional(Requires_New) 
//a new transaction is created and the "outer" is suspended
//to import one dataset is below 5min
void importOneDataSet(){
...
}

我假设外部事务超时在暂停/暂停时停止但我仍然在5分钟后遇到事务timout错误。

所以暂停交易似乎不影响其交易超时?该应用服务器是否具体我们是否在JEE标准中定义?第三个问题是:您如何解决这个问题?不要打开外部交易?增加该事务的超时(仅限)?

令人费解的是,我读过的大多数交易文章甚至都没有提到这个事实。关于该主题的唯一提示是one blog post

1 个答案:

答案 0 :(得分:1)

AFAIK,您无法配置外部事务超时会发生什么。嵌套事务永远不会将超时设置为暂停外部事务。如果您不想影响外部事务超时,则应使内部事务异步。这样,方法将立即返回并且不影响外部tnx超时。因此,在您的示例中,我将尝试使importOneDataSet不同步。但是您应该知道,如果使它异步,则无法保持完整的导入一致(即使将tnx类型设置为必需的事务管理器,外部事务也不能回滚内部异步事务的工作,无法使同一事务在多个线程上保持打开状态)。因此,如果完全导入必须保持一致,或者如果必须保持导入数据集的顺序,则最简单的解决方案是增加导入的tnx timout。如果完全导入的超时时间太长(意味着发生错误,则意味着您会丢失过多的工作),则应将较大的工作划分为仅导入较小的工作块,在此您可以独立于其他工作块重复执行单个工作块以防万一。