@Traynchronous函数偶尔会发生EJBTransactionRolledbackException

时间:2011-09-08 11:14:39

标签: java java-ee glassfish ejb

我正在使用Java 1.6.0_23和Glassfish 3.1.1。我有两个Singleton EJB。一个是使用TimerService来激活@Timeout函数。在@Timeout期间,在另一个Singleton EJB中调用了@Asynchronous函数。它有95%的时间没有任何错误。但是在调用@Asynchronous函数的另外5%的时间里,我得到以下错误,没有证据表明它甚至启动了@Asynchronous函数。没有记录其他错误详细信息。

有什么想法吗?

PS:我尝试将Glassfish中的最大EJB数量从32增加到64.没有变化。

java.util.concurrent.ExecutionException: javax.ejb.EJBTransactionRolledbackException
        at com.sun.ejb.containers.EjbAsyncTask.call(EjbAsyncTask.java:132) ~[ejb-container.jar:3.1.1]
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) ~[na:1.6.0_23]
        at java.util.concurrent.FutureTask.run(FutureTask.java:138) ~[na:1.6.0_23]
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) ~[na:1.6.0_23]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) ~[na:1.6.0_23]
        at java.lang.Thread.run(Thread.java:662) ~[na:1.6.0_23]
Caused by: javax.ejb.EJBTransactionRolledbackException: null
        at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2305) ~[ejb-container.jar:3.1.1]
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2088) ~[ejb-container.jar:3.1.1]
        at com.sun.ejb.containers.EjbAsyncTask.call(EjbAsyncTask.java:114) ~[ejb-container.jar:3.1.1]
        ... 5 common frames omitted
Caused by: javax.ejb.TransactionRolledbackLocalException: Client's transaction aborted
        at com.sun.ejb.containers.BaseContainer.useClientTx(BaseContainer.java:4699) ~[ejb-container.jar:3.1.1]
        at com.sun.ejb.containers.BaseContainer.preInvokeTx(BaseContainer.java:4577) ~[ejb-container.jar:3.1.1]
        at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1910) ~[ejb-container.jar:3.1.1]
        at com.sun.ejb.containers.EjbAsyncTask.call(EjbAsyncTask.java:99) ~[ejb-container.jar:3.1.1]
        ... 5 common frames omitted

2 个答案:

答案 0 :(得分:1)

您必须查找在此之前发生的其他错误(可能是吞下的异常,因为您说没有其他错误)。如果当前trx已被标记为回滚,并且您仍然在数据库上执行操作,则会发生EJBTransactionRolledbackException。

答案 1 :(得分:1)

也发生在我身上。 似乎问题不是编码问题,而是服务器资源。

我增加了http线程池大小 这对我来说是5最大值,我把它改为10

似乎解决了这个问题。

此处还有一些关于此错误的说明: http://pcjuzeren.blogspot.co.il/2008/12/clients-transaction-aborted.html