Javascript Return@Async方法生成SpringMVC并将其返回到Ajax客户端
我的控制器中有一些方法,可以执行Javascript Return@Async方法生成SpringMVC并将其返回到Ajax客户端,javascript,ajax,spring,jakarta-ee,spring-mvc,Javascript,Ajax,Spring,Jakarta Ee,Spring Mvc,我的控制器中有一些方法,可以执行@Async任务 @Async public Future<String> getResultFromServer(){ String result = ...... return new AsyncResult<String>(result); } 我知道这非常接近Comit模型,但我对comet一般不太熟悉 我的问题是如何使用JavaScript/JQuery在客户端保持连接打开 我的@RequestMapping(
@Async
任务
@Async
public Future<String> getResultFromServer(){
String result = ......
return new AsyncResult<String>(result);
}
我知道这非常接近Comit模型,但我对comet一般不太熟悉
我的问题是如何使用JavaScript/JQuery在客户端保持连接打开
我的
@RequestMapping(value=“/async.do”,method=RequestMethod.POST)
method是否会将结果推送到客户端?最简单的方法不是以异步方式调用该方法,而是直接从控制器以同步方式调用它
然后,请求将需要“等待”直到计算出方法结果,并在创建后立即返回
当然,这意味着连接将被打开多长时间(1分钟)。感谢您的回答和直接执行方法的想法,我还有另一个问题:据我所知,Tomcat在为我的HTTP连接打开的单独线程中处理我的请求。这是否意味着如果我的请求持续15分钟,Tomcat线程将一直运行?这是否意味着此操作需要两个线程—一个用于请求,另一个用于异步任务?有没有办法在执行第二个线程(异步任务)时挂起第一个线程?如果使用
@async
,那么您有两个线程,一个线程调用@async
注释的方法并立即返回,另一个线程真正在@async
方法中执行任务。要挂起第一个线程,只需调用future.get(),这将阻止该线程,直到调用结果为止。但是如果这样做:调用@async
并在wards之后直接调用future.get(),那么完整的@async
内容是无用的,因为你用大量的技术材料模拟(几乎)方法调用的正常行为。@danny.lesnik:但是如果你的计算需要15分钟,那么你真的需要一个其他的解决方案,而不是在这段时间内保持连接!是的,我明白,你知道吗?我不确定Spring MVC是否可以与Comet一起使用,如果可以,如何实现它。@danny.lesnik:将此作为一个新问题发布,您最终是如何解决此问题/第2部分的?
@RequestMapping(value="/async.do", method=RequestMethod.POST)
public void getResult(HttpServletResponse res){
String result = null;
PrintWriter out = res.getWriter();
Future<String> future = getResultFromServer();
try {
if (future.isDone())
result = future.get();
out.println(result);
out.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}