[英]Using servlets to talk to persistent java application
請參閱下面的更新
我很困惑,並嘗試在論壇中搜索可能的解決方案。 我確定那里有解決方案,但也許我現在還不知道正確的術語。
所以這是我的問題:我有一個Java應用程序,它執行非常復雜的數值計算,並根據環境中的核數等很好地進行擴展。但是,我現在正嘗試將此計算公開給Internet接口。
第一步:我只是嘗試將其放在servlet中,但意識到這在解決方案上是個頭緒,特別是考慮到可以將多個servlet稱為產生多個實例。 我只希望該計算的一個實例在后台運行,因為多個用戶將只使用同一數據集。
我想要的是:1.用戶向“開始”此計算的servlet發出請求。 此計算需要幾分鍾才能運行。 2.將返回“開始”請求,以便現在可以使用ajax查詢進度。 3.如果計算已經在運行,並且另一個用戶嘗試開始計算,則不會。
我之前的搜索結果是這樣,我試圖模仿該設計: java中的請求觸發的進程狀態
謝謝!
更新:好的,所以我能夠找到一個簡單示例,該示例具有我想要的95%的示例: AJAX(原型/ java)在執行過程中獲取部分狀態更新
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中以供所有請求訪問?
您可以簡單地將其存儲在servlet本身的字段中,因為同一servlet實例用於處理所有請求。
如果希望幾個不同的Servlet都可以使用它,則將其存儲為ServletContext的屬性,該屬性也稱為“應用程序范圍”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.