簡體   English   中英

Java EE中的異步執行

[英]Asynchronous execution in Java EE

我正在學習Java EE(從SE遷移),我對Java EE環境中的異步執行感到困惑。
基本上我理解創建ThreadTimer並不是完全建議的。 到目前為止我發現的另一種方法是使用JMS將消息傳遞給EJB Message Bean,它將以異步方式執行。

有哪些其他方法可以實現此行為? 使用JMS的原因看起來對於簡單任務來說太多開銷。

Java EE 6中最簡單的解決方案是在EJB方法(或整個類)上使用@Asynchronous批注。 它允許您異步調用業務方法,這意味着將委派新線程來執行此方法,並且您將在調用方法中獲得控制權。

在Java EE之前的6天中,JMS用於此目的。

作為旁注 - 在Servlet中,您也可以使用異步執行。

您可以使用spring任務執行程序

其他作業可能將其放入數據庫並執行輪詢數據庫的任務。

對於大型應用程序,您甚至可以考慮使用企業服務總線。

這一切都取決於任務的重要性以及您願意做的努力。

對於不那么重要的任務,簡單的線程通常會做到這一點。

基本上,異步行為是通過線程實現的,沒有解決這個問題。

但是,在Java EE環境中,自己打開線程被認為是一種不好的做法。 很可能你會想要使用你的服務器工具,它會為你提供一個(適當的)托管環境來做異步工作。

JMS是執行異步任務的一種方法,我建議對於需要連續處理的任務流。 大多數Java應用程序服務器都有調度管理器,允許您在將來安排單個任務(例如通過石英)。 一些框架還支持@javax.ejb.Asynchronous的Java EE 6注釋。

是的,如果你必須,你總是可以產生一個Thread並忘掉它。 只要確保你知道你在做什么。

這一切都歸結為您的確切用例,以及您的環境支持的方法。 沒有一個真正的答案。

Java EE 6和Spring愛好者已經說過了; 不知何故,每個人都從Java EE 5中取消了javax.ejb.TimerService ,我猜想,目前[截至2011年]是主流平台。

基本上,您在無狀態消息驅動的 bean中注入TimerService ,並使用其createTimer(...)方法之一來安排異步執行。 然后在帶注釋的方法中實現超時邏輯:

@Timeout
void anyMethod(javax.ejb.Timer timer) { ... }

就是這樣。 僅僅為了它的異步性而使用JMS從來就不是一個好的選擇,除非在很久以前就像在J2EE中一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM