我正在開發一個EJB,它將其他組件(EJB,Web服務等)的10+調用作爲其業務邏輯的一部分。就我而言,表現是一個巨大的問題。這個EJB將每天處理數百萬個請求。如何超時EJB中的阻塞調用?
我的問題是:對於這10多個電話中的每一個,我該如何強制超時?
我無法等待任何一個呼叫返回的時間超過'n'秒。如果通話時間超過'n'秒,我將使用默認響應進行處理。
我通常會使用Executor來解決這個問題,但是據我所知,不應該從EJB內產生線程,因爲它可能會干擾EJB的生命週期。
我正在開發一個EJB,它將其他組件(EJB,Web服務等)的10+調用作爲其業務邏輯的一部分。就我而言,表現是一個巨大的問題。這個EJB將每天處理數百萬個請求。如何超時EJB中的阻塞調用?
我的問題是:對於這10多個電話中的每一個,我該如何強制超時?
我無法等待任何一個呼叫返回的時間超過'n'秒。如果通話時間超過'n'秒,我將使用默認響應進行處理。
我通常會使用Executor來解決這個問題,但是據我所知,不應該從EJB內產生線程,因爲它可能會干擾EJB的生命週期。
如何強制超時?
的EJB3.1規範提供了使用@AccessTimeout註解,也適用於那些需要等待當會話bean實例 忙於執行前一個請求序列化客戶端調用設置超時的可能性。清楚地(在說明書中描述了這一點),這適用於StateFul和Singleton會話bean,儘管它可以在bean池用完可用實例的情況下實現爲無狀態。 注意,一旦客戶端調用的業務方法正在進行,此超時不適用。
其他可能性不是規範的一部分,但是,由多個服務器(see JBoss example)支持的是在遠程客戶端定義超時。如果客戶端調用 需要的時間超過配置的超時時間,則會通知客戶端,但是,服務器執行不會中斷,因爲它不夠好。
設置事務超時時間既不是一個好的選擇,因爲不能保證當事務超時到期時執行業務邏輯的線程將被中斷。
我通常會使用一個Executor來解決這個問題,但是,從我的理解,不應該從EJB中生成線程..
相反,你可以使用ManagedExecutorService類是適用於EJB容器內的Executor擴展。
此外,爲了在EJB中實現異步調用,請查看@Asynchronous註釋,它提供了高級抽象來解決您面臨的多線程問題。 Future類中的Cancel()方法允許您在考慮到進程耗時過長的情況下中斷線程的執行。
因爲你沒有提供您的環境中的細節: