我完全不熟悉Spring框架(以及大多数web开发),但我正在尝试将一些繁重的Java后端代码连接到一个新的Spring和JSP项目中。我的控制器的handleRequest()在返回我的request.jsp ModelAndView对象之前启动了一个长时间运行的工作线程。在那之后,我希望仍然能够从我的JSP表单与这个控制器交互,以便能够在单击表单中的按钮时调用控制器中的isThreadDone()。基于三个不同的结果,我会相应地重定向。对于我目前的方法,这是可能的吗?这似乎违反了Spring MVC的一些方法,但是我想不出一个好的方法来解决这个问题。如果这里有什么离谱的地方,请原谅我的无知。提前谢谢。
发布于 2011-07-22 06:53:00
看一下Spring @Async注解。如果您使用该注释注释服务层bean,则它将在其自己的线程中运行,从而允许您的控制器线程在调用Service方法后不会中断地运行。让该线程通过synchronous方法在类级别为服务设置一个值,您的控制器代码可以随意检查这些切换,以查看过程是否完成。类似于:
@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中。然后线程将更新单独的切换,每个请求一个。
发布于 2011-07-22 03:45:06
好吧,一切皆有可能,对吧?根据您所提供的内容,您可以只保留对线程的引用--可能在HttpSession中--这样当单击按钮收到新请求时,您就可以查询它并返回适当的响应。
https://stackoverflow.com/questions/6781776
复制相似问题