2012-01-18 32 views
5

我有一個調用EJB B的EJB A。用戶界面不應該等待超過30秒的響應時間。如果缺少某些數據,則應返回部分響應。使EJB超時進行調用

如何在EJB B上定義超時(時間限制爲30秒)?

我可以將EJB B定義爲Asynchronous,它返回Future,然後執行Future.get(30, TimeUnit.SECONDS)。 但這是最好的解決方案嗎?

謝謝

P.S.我使用glassfish 3.1

回答

0

要爲適用於其所有方法的bean配置超時,必須在glassfish-ejb-jar.xml中配置屬性cmt-timeout-in-seconds

該超時值由發起新事務的bean的所有方法使用,當它們加入其他正在進行的事務時不適用。

也可以參考此link瞭解更多關於超時的詳細信息。

2

沒有辦法中斷目標EJB。唯一真正的選擇是目標EJB協作並定期檢查它是否超出了預期的目標響應時間。

即使您使用@AsynchronousFuture.get超時,您也可以簡單地解除阻止客​​戶端等待結果;目標EJB將繼續執行並消耗資源。但是,使用異步方法,您可以使用Future.cancelSessionContext.wasCancelCalled獲得某些內置協作式取消的好處。

+0

我並不是要打斷EJB。這個想法是在30秒後向UI返回響應(或「超時錯誤」)。 – lili

+2

當然,但在沒有超時的情況下超時前端似乎是不明智的。最終,您的後端線程將被消耗,您的前端線程將不得不等待。鑑於你所說的話,使用'@ Asynchronous'可能是最好的。 –

5

我會建議使用事務超時爲此。

我不認爲有一個標準的配置方式,所以它將取決於應用程序服務器。我假設你想專門爲每個類或方法設置它。

對於WebLogic,您可以在「transaction-descriptor」的「weblogic-ejb-jar.xml」中指定它或使用註釋「@TransactionTimeoutSeconds」。

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

對於JBoss AS,你可以使用註釋 「@TransactionTimeout」 或 「jboss.xml中」 設置事務超時。

https://community.jboss.org/wiki/TransactionTimeout

我相信有在每一個應用程序服務器類似的配置選項。

相關問題