2013-12-08 33 views
0

查看更新下面使用servlet交談持久的Java應用程序

我被難住了,並嘗試搜索論壇,可能的解決方案。我確信有一個解決方案,但也許我還不知道正確的術語。

所以這裏是我的問題: 我有一個Java應用程序,做了一個非常複雜的數值計算,根據環境中的內核數量等很好地擴展...但是,我現在試圖公開這個計算到互聯網界面。第一次刺戳:我試着把它放在一個servlet中,但意識到這是一個非常不滿意的解決方案,尤其是考慮到可以調用多個servlet來生成多個實例。我只希望在後臺運行該計算的一個實例,因爲多個用戶只會使用相同的數據集。

我想要的: 1.用戶向一個servlet發出「啓動」這個計算的請求。該計算需要幾分鐘才能運行。 2.「開始」請求返回,現在使用ajax,我可以查詢進度。 3.如果計算已經在運行,而另一個用戶試圖開始計算,則不會。

我以前的搜索結果在此,我想模仿設計:Status of the process triggered by request in java

謝謝!

UPDATE: 好了,所以我能找到有我想要的95%,一個簡單的例子:AJAX (prototype/java) getting partial status updates during execution

package main; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class Main extends HttpServlet { 


public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    System.out.println("Found post request!"); 
    processPostRequest(request, response); 

} 

/** 
* Handles http get requests by mapping them to processRequest() 
*/ 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 

    System.out.println("Found get request!"); 
    processPostRequest(request, response); 
} 

public void processPostRequest(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    LongProcess longProcess = null; 
    if(request.getSession().getAttribute("longProcess") != null) { 
     longProcess = (LongProcess) request.getSession().getAttribute("longProcess"); 
     System.out.println("Found longProcess object in JVM!"); 

     response.getWriter().write(String.valueOf(longProcess.getProgress()) + "%"); 
    } 
    else { 
     longProcess = new LongProcess(); 
     //longProcess.setDaemon(true); 
     longProcess.start(); 
     request.getSession().setAttribute("longProcess", longProcess); 
     response.getWriter().write("The long process has started!"); 
    } 
} 
} 
class LongProcess extends Thread { 

    private int progress; 
    public void run() { 
     while (progress < 100) { 
      try { sleep(1000); } catch (InterruptedException ignore) {} 
      progress++; 
     } 
    } 

    public int getProgress() { 
     return progress; 
    } 
} 

什麼我現在的問題是:我存儲分開線程對象「longProcess」在請求的上下文中。雖然這適用於定期查詢過程的狀態,即(我會得到1%.... 5%.... 9%....一直到100%),當我開始請求時從一個瀏覽器,然後從另一個瀏覽器發出請求,我得到兩個單獨的實例運行。我想這是因爲將它存儲在請求的上下文中。

有沒有辦法將線程對象存儲在JVM中,以便來自全局的請求可以訪問同一個對象?我知道我需要同步等......但我希望能夠從不同的請求上下文中看到相同的對象。

我試着看着System.setProperty(),但似乎只適用於字符串。是否有相當於: request.getSession()。setAttribute(「longProcess」,longProcess); 而是將其存儲在JVM中以訪問所有請求?

+0

你可能會考慮Spring MVC。將控制器包裝在這些事物中並使用AutoConfig運行嵌入式Web服務器非常簡單。 – chrylis

回答

1

您可以簡單地將它存儲在servlet本身的一個字段中,因爲同一個servlet實例用於提供所有請求。

如果您希望它可以被幾個不同的servlet使用,那麼將其作爲ServletContext的一個屬性存儲,該屬性也被稱爲「應用程序範圍」。

+0

啊完美!!!!那正是我需要的!我知道這聽起來很荒謬,但我一直努力修復這個設計一個星期難住。 – user2891729

相關問題