2017-06-07 88 views
0

我有一个类,它是这样的:Wildfly治疗并发管理,事务

@Singleton 
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
@Lock(LockType.WRITE) 
@AccessTimeout(value = 20, unit = TimeUnit.MINUTES) 
public class MyClass{ 

    public void someLongRunningQuery(){ 

    } 

} 

然而,这会失败:

org.jboss.resteasy.spi.UnhandledException: javax.ejb.EJBTransactionRolledbackException: Transaction rolled back

我能加入这个解决此注解。

@TransactionTimeout(value = 20, unit = TimeUnit.MINUTES)

我的问题是 - 为什么JBoss的治疗这种方法作为交易?我的理解是并发管理和事务管理是不同的事情。

+0

'someLongRunningQuery()'是否涉及事务范围。 –

回答

0

事务超时处理没有在EJB规范中定义,JBoss使用一个单独的事务管理模块来完成。您的示例指向您的单例的REST访问 - Singleton是否也是REST端点,还是从某个REST端点Bean调用?只有几点想法:
如果您有一个REST端点注入您的单例并调用长时间运行的操作,是不是有一个@Stateless bean?默认情况下,EJB bean是事务启用的,因此如果客户机(REST端点)启动一个事务(它默认为@TransactionAttribute(REQUIRED)),那么您的单例也会参与同一个事务,但因为它的调用比默认事务超时值(300s)它会导致事务回滚。如果您不需要在其他层上进行事务处理,请尝试使用@TransactionAttribute(NOT_SUPPORTED)
将其禁用。如果您从REST层调用此长时间运行的操作系统,使用@Asynchronous并返回某种请求/作业句柄客户端,以便它可以查询操作的状态,而不是在完成时等待和阻止?请记住,EJB是集中资源,因此多次调用此long操作可能会耗尽您的池并导致获取超时。