我有兩個任務需要執行,分別是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隊列的想法是一個更好的主意,如果調整線程池的大小是有問題的。 –