Java EJB嵌套@Asynchronous调用

时间:2013-01-15 21:24:46

标签: java asynchronous ejb deadlock

假设我们有两个异步调用的方法。 methodA()被调用了几千次,而在某个地方,methodA()调用了methodB()。在继续之前,methodB()的调用者需要使用Future / AsyncResult得到结果。

@Asynchronous methodA()

@Asynchronous methodB()

问题是它们使用相同的线程池,并且一旦所有的methodA()调用排队,就没有更多的线程可用于methodB()。因此,正在运行的所有methodA()调用都在等待methodB(),并且我们有一个死锁。

这周围有吗?是不是应该有一种方法来指定在@Asynchronous方法中使用哪个线程池?我们正在使用glassfish 3.1.2.2。

Stack trace有很多这样的线程:

   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007e1a4b010> (a java.util.concurrent.FutureTask$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at com.sun.ejb.containers.EjbFutureTask.get(EjbFutureTask.java:106)

0 个答案:

没有答案