使用servlet与持久化java应用程序对话

使用servlet与持久化java应用程序对话,java,servlets,Java,Servlets,请参见下面的更新 我被难倒了,并尝试在论坛上搜索可能的解决方案。我确信有一个解决方案,但也许我还不知道正确的术语 这就是我的问题: 我有一个java应用程序,它可以进行相当复杂的数值计算,可以根据环境中的内核数量进行很好的扩展,等等。。。然而,我现在正试图将此计算公开给internet接口 第一点:我试着把它放在一个servlet中,但意识到这是一个非常不受欢迎的解决方案,特别是考虑到可以调用多个servlet来生成多个实例。我只希望此计算的一个实例在后台运行,因为多个用户将只使用相同的数据集

请参见下面的更新

我被难倒了,并尝试在论坛上搜索可能的解决方案。我确信有一个解决方案,但也许我还不知道正确的术语

这就是我的问题: 我有一个java应用程序,它可以进行相当复杂的数值计算,可以根据环境中的内核数量进行很好的扩展,等等。。。然而,我现在正试图将此计算公开给internet接口

第一点:我试着把它放在一个servlet中,但意识到这是一个非常不受欢迎的解决方案,特别是考虑到可以调用多个servlet来生成多个实例。我只希望此计算的一个实例在后台运行,因为多个用户将只使用相同的数据集

我想要的是: 1.用户向“启动”此计算的servlet发出请求。此计算需要几分钟才能运行。 2.返回“start”请求,以便现在使用ajax查询进度。 3.如果计算已经在运行,而另一个用户试图启动计算,则不会

我之前的搜索结果是,我试图模仿设计:

谢谢大家!

更新: 好的,我找到了一个简单的例子,它有我想要的95%:

packagemain;
导入java.io.IOException;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类Main扩展了HttpServlet{
public void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
System.out.println(“找到post请求!”);
processPostRequest(请求、响应);
}
/**
*通过将http get请求映射到processRequest()来处理这些请求
*/
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
System.out.println(“找到获取请求!”);
processPostRequest(请求、响应);
}
公共无效processPostRequest(HttpServletRequest请求,HttpServletResponse响应)
抛出ServletException、IOException{
LongProcess LongProcess=null;
if(request.getSession().getAttribute(“longProcess”)!=null){
longProcess=(longProcess)request.getSession().getAttribute(“longProcess”);
System.out.println(“在JVM中找到了longProcess对象!”);
response.getWriter().write(String.valueOf(longProcess.getProgress())+“%”;
}
否则{
longProcess=新的longProcess();
//setDaemon(true);
longProcess.start();
request.getSession().setAttribute(“longProcess”,longProcess);
response.getWriter().write(“漫长的进程已经开始!”);
}   
}
}
类LongProcess扩展线程{
私人投资进展;
公开募捐{
而(进度<100){
试试{sleep(1000);}catch(InterruptedException ignore){}
进步++;
}
}
public int getProgress(){
返回进度;
}
}
我现在的问题是:我正在请求的上下文中存储单独的线程对象“longProcess”。当我从一个浏览器启动请求,然后从另一个浏览器发出请求时,我会运行两个单独的实例。我认为这是因为将其存储在请求的上下文中

有没有办法将线程对象存储在JVM中,这样来自世界各地的请求都可以访问同一个对象?我知道我需要同步等等。。。但是我希望能够从不同的请求上下文中看到相同的对象

我试图查看System.setProperty(),但这似乎只适用于字符串。是否有相当于: request.getSession().setAttribute(“longProcess”,longProcess)
而是将其存储在JVM中以供所有请求访问?

您只需将其存储在servlet本身的一个字段中,因为相同的servlet实例用于服务所有请求


如果您希望它可以由几个不同的servlet提供,则将其存储为Servlet上下文的属性,也称为“应用范围”。

您可以考虑Spring MVC。围绕这些东西包装一个控制器并运行一个带有自动配置的嵌入式Web服务器是非常容易的。啊,太完美了!!!!这正是我所需要的!我知道这听起来很可笑,但我已经被难倒了一个星期,试图修复这个设计。
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;
    }
}