我有两个任务需要执行,分别是task1
和task2
,它们是相同业务流程的一部分。当task1
完成时,我必须对最终用户做出响应,因此它的响应时间必须最小化。使用EJB的正确方法异步方法
我目前的做法是执行task1
,只要task1
完成,就异步调用task2
方法。 task2
是复杂的,它的响应时间超出了我的控制范围,因为它具有一些外部依赖性。
@Stateless
public class SessionBean1 {
@Inject
SessionBean2 sessionBean2;
public void doTask1(){
// task one stuff
sessionBean2.doTask2();
}
}
@Stateless
public class SessionBean2 {
@Asynchronous
public void doTask2(){
// do task2 stuff
}
}
在websphere 8.0(所使用的EJB容器)中,同步方法和异步方法由不同的线程池运行。
我的初步假设是,即使task2
表现不佳,task1
也没有影响,但可悲的是,事实并非如此。
如果task2
执行得不好,异步线程池中的所有线程都将被占用。这将导致task1
等待异步线程空闲,因此task1
会产生影响。
在websphrere服务器日志的消息: The request buffer for thread pool WorkManager.WebSphere_EJB_Container_AsynchMethods_Internal_WorkManager has reached its capacity
我的问题是,这将是实现我想要在这里实现有道。
如果您使用的是Java EE 7,您可以使用@AccessTimeout(value = xx)批注,但我认为Websphere是Java EE 6? – rjdkolb
@mattfreake:如链接[image](http://2.1m.yt/itzn6So。jpg),异步方法请求的数量是有限的,并且取决于异步线程的数量。我可以增加线程的数量,但即使task2表现不佳,我的task1仍然需要等待。此外,线程的数量不受硬件配置的限制。 – ares
使用@rjdkolb建议的JMS队列的想法是一个更好的主意,如果调整线程池的大小是有问题的。 –