簡體   English   中英

使用Servlet與持久性Java應用程序對話

[英]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.

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