Lon*_*zak 5 jboss transactions ejb-3.0 java-ee-7 jakarta-ee
我有一个在 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(){
...
}
Run Code Online (Sandbox Code Playgroud)
我假设外部事务超时在暂停/暂停时停止,但 5 分钟后我仍然遇到事务超时错误。
那么看来暂停交易并不会影响它的交易超时时间?该应用程序服务器是否特定于 JEE 标准中定义的?第三个问题是:你将如何解决这个问题?不开放外部交易吗?(仅)增加该事务的超时?
令人费解的是,我读过的大多数交易文章甚至没有提到这一事实。关于该主题的唯一提示是一篇博客文章。
小智 2
AFAIK 您无法配置外部事务超时会发生什么。嵌套事务永远不会设置外部事务的暂停超时。如果您不想影响外部事务超时,则应该使内部事务异步。这样该方法将立即返回并且不会影响外部 tnx 超时。所以在你的例子中我会尝试使 importOneDataSet 异步。但您应该知道,如果将其设为异步,则无法保持完整导入的一致性(即使将 tnx 类型设置为所需的事务管理器,外部事务也无法回滚内部异步事务的工作,事务管理器无法在多个线程上保持同一事务打开)。因此,如果您的完整导入必须保持一致,或者如果您必须保持数据集导入的顺序,最简单的解决方案是增加导入的 tnx 超时。如果完全导入的超时时间太长(意味着万一发生错误,您会丢失太多工作),您应该划分大的工作,只导入较小的工作块,您可以独立于其他块重复单个工作块如果发生错误。
| 归档时间: |
|
| 查看次数: |
1383 次 |
| 最近记录: |