请参阅下面的更新
我很困惑,并尝试在论坛中搜索可能的解决方案。我确定那里有解决方案,但也许我现在还不知道正确的术语。
所以这是我的问题:我有一个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的属性,该属性也称为“应用程序范围”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句