2013-12-08 27 views
0

查看更新下面使用servlet交谈持久的Java应用程序

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

所以这里是我的问题: 我有一个Java应用程序,做了一个非常复杂的数值计算,根据环境中的内核数量等很好地扩展...但是,我现在试图公开这个计算到互联网界面。第一次刺戳:我试着把它放在一个servlet中,但意识到这是一个非常不满意的解决方案,尤其是考虑到可以调用多个servlet来生成多个实例。我只希望在后台运行该计算的一个实例,因为多个用户只会使用相同的数据集。

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

我以前的搜索结果在此,我想模仿设计:Status of the process triggered by request in java

谢谢!

UPDATE: 好了,所以我能找到有我想要的95%,一个简单的例子:AJAX (prototype/java) getting partial status updates during execution

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中以访问所有请求?

+0

你可能会考虑Spring MVC。将控制器包装在这些事物中并使用AutoConfig运行嵌入式Web服务器非常简单。 – chrylis

回答

1

您可以简单地将它存储在servlet本身的一个字段中,因为同一个servlet实例用于提供所有请求。

如果您希望它可以被几个不同的servlet使用,那么将其作为ServletContext的一个属性存储,该属性也被称为“应用程序范围”。

+0

啊完美!!!!那正是我需要的!我知道这听起来很荒谬,但我一直努力修复这个设计一个星期难住。 – user2891729

相关问题