繁体   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