我需要执行两项任务,即task1和task2,它们是同一业务流程的一部分.当task1完成时,我必须对最终用户做出响应,因此必须最小化响应时间.
我目前的方法是执行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服务器日志中的消息:
线程池WorkManager.WebSphere_EJB_Container_AsynchMethods_Internal_WorkManager的请求缓冲区已达到其容量
我的问题是什么是实现我在这里想要实现的目标的正确方法.