2011-09-29 94 views

回答

2

這真的取決於您使用的堆棧j2EE?它只是網絡,ejb層或兩者?如果我們在談論Web,那麼您可以使用在最新的Java EE規範中引入的異步servlet,如果您使用純EJB,那麼自然選擇是Messege驅動bean(提到的JMS)。你當然可以設計一個自定義的解決方案,例如你發送一些數據進行處理,然後j2ee應用程序自己調用你的應用程序(例如通過http請求)來通知它完成了運行的工作。可能性是無止境的,如果一個人比其他人好,總是取決於具體的情況。

+0

謝謝先生,這很合適 – volk

0

如果我正確理解你所說的是能夠開始一項任務(這將需要一些時間),然後在用戶仍然在做這些任務時迴應用戶。根據您的要求,它非常簡單,您可以使用簡單的舊Java線程來執行操作。

public class DoSillyCounting extends Thread { 
    private volatile int counter; 
    public int getCounter() { return counter; } 
    public run() { 
     while (counter < 10) { 
      counter ++; 
      try { Thread.sleep(1000); } 
      catch (InterruptedException ie) { } 
     } 
    } 
} 

在您的設置頁面,你可以這樣做:(會話是一個HttpSession)

DoSillyCounting doSillyCounting = new DoSillyCounting(); 
doSillyCounting.start(); 
session.putValue("tenSecondsCounter", doSillyCounting); 
/* Here you can respond to the user while the Thread is executing */ 

而在你的狀態頁面,你可以這樣做:

DoSillyCounting doSillyCounting = 
    (DoSillyCounting)session.getValue("tenSecondsCounter"); 
out.print(Integer.toString(doSillyCounting.getCounter()); 
if (doSillyCounting.isAlive()) { 
    out.print("Still Working on it"); 
} else { 
    out.print("Yippee, I finished"); 
} 

當然,這是一個相當無用的例子,當你可能有大量的請求滿足時,這個模型不是一個好主意,那麼值得看一下ThreadPool實現或者使用類似JMS的東西。

+2

在討論j2ee時產生自己的線程通常非常糟糕的想法 – Kris

+1

點好了。 – tribeca

+0

感謝您的幫助! – volk

相關問題