我有一個調用EJB B
的EJB A
。用戶界面不應該等待超過30秒的響應時間。如果缺少某些數據,則應返回部分響應。使EJB超時進行調用
如何在EJB B
上定義超時(時間限制爲30秒)?
我可以將EJB B
定義爲Asynchronous
,它返回Future
,然後執行Future.get(30, TimeUnit.SECONDS)
。 但這是最好的解決方案嗎?
謝謝
P.S.我使用glassfish 3.1
我有一個調用EJB B
的EJB A
。用戶界面不應該等待超過30秒的響應時間。如果缺少某些數據,則應返回部分響應。使EJB超時進行調用
如何在EJB B
上定義超時(時間限制爲30秒)?
我可以將EJB B
定義爲Asynchronous
,它返回Future
,然後執行Future.get(30, TimeUnit.SECONDS)
。 但這是最好的解決方案嗎?
謝謝
P.S.我使用glassfish 3.1
要爲適用於其所有方法的bean配置超時,必須在glassfish-ejb-jar.xml中配置屬性cmt-timeout-in-seconds
。
該超時值由發起新事務的bean的所有方法使用,當它們加入其他正在進行的事務時不適用。
也可以參考此link瞭解更多關於超時的詳細信息。
沒有辦法中斷目標EJB。唯一真正的選擇是目標EJB協作並定期檢查它是否超出了預期的目標響應時間。
即使您使用@Asynchronous
和Future.get
超時,您也可以簡單地解除阻止客戶端等待結果;目標EJB將繼續執行並消耗資源。但是,使用異步方法,您可以使用Future.cancel
和SessionContext.wasCancelCalled
獲得某些內置協作式取消的好處。
我會建議使用事務超時爲此。
我不認爲有一個標準的配置方式,所以它將取決於應用程序服務器。我假設你想專門爲每個類或方法設置它。
對於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
我相信有在每一個應用程序服務器類似的配置選項。
我並不是要打斷EJB。這個想法是在30秒後向UI返回響應(或「超時錯誤」)。 – lili
當然,但在沒有超時的情況下超時前端似乎是不明智的。最終,您的後端線程將被消耗,您的前端線程將不得不等待。鑑於你所說的話,使用'@ Asynchronous'可能是最好的。 –