按钮onClick调用Java方法直到某些结果

时间:2011-07-21 19:41:32

标签: java model-view-controller spring jsp controller

我对Spring框架(以及大多数Web开发)都是新手,但我正在尝试将一些繁重的Java后端代码连接到一个新的Spring和JSP项目。 My Controller的handleRequest()在返回request.jsp ModelAndView对象之前,正在启动一个长时间运行的工作线程。之后,我希望能够从我的JSP表单继续与此Controller接口,以便在单击表单中的按钮时能够在Controller中调用isThreadDone()。基于三个不同的结果,我然后重新定向。我目前的做法有可能吗?这似乎违反了一些Spring MVC方法,但我想不出一个好的方法来做到这一点,我可以把头脑包裹起来。如果有什么消息在这里,请原谅我的无知。提前谢谢。

2 个答案:

答案 0 :(得分:1)

嗯,一切皆有可能,对吗?根据您提供的内容,您可以保留对线程的引用 - 可能在HttpSession中 - 以便当单击按钮进入新请求时,您可以查询它并返回适当的响应。

答案 1 :(得分:1)

看一下Spring @Async注释。如果使用该批注对Service层bean进行批注,则它会在自己的线程中运行,从而允许您的Controller线程在调用Service方法后不间断地运行。通过synchronous方法为该服务的类级别设置一个值,并且您的Controller代码可以随意检查这些切换以查看该过程是否已完成。类似的东西:

@Service
public myServiceClass {
   private boolean isDone = false;
   public synchronized void setIsDone(boolean isDone) {
      isDone = isDone;
   }
   public synchronized boolean getIsDone() {
      return isDone;
   }
   @Async
   public void myServiceMethod() {
      ...long-running stuff...
      setIsDone(true);
   }

在控制器中:

@Controller
class MyController {
   @RequestMapping
   public kickOffHandlerMethod() {
      myServiceClass.myServiceMethod();
      }
   }
   @RequestMapping
   public dependentHandlerMethod() {
      if(myServiceClass.getIsDone()) {
         ...do something...
      }
   }
}

如果多个请求可能会启动该过程,那么我会使用某种标识符将每个isDone切换保存在HashMap中。然后线程将更新单个切换,每个请求一个。