Java Spring控制器内部的异步处理
我有一个请求处理程序,它在内部执行一些繁重的操作,大约需要5秒钟才能返回。请求返回一个包含3个集合的模型。最重的收集需要大约2秒的时间来处理,它们都是独立的。我想尝试在请求中并行运行它们,但我尝试过的一切似乎都不起作用。我看到的是tomcat处理了最初的几个请求,但很快它就停止了 以下是Iv'e的尝试: 我有一个实用程序,它接受Callable,在一个相当大的执行器上运行它们,并返回FutureTasksJava Spring控制器内部的异步处理,java,spring,spring-mvc,asynchronous,Java,Spring,Spring Mvc,Asynchronous,我有一个请求处理程序,它在内部执行一些繁重的操作,大约需要5秒钟才能返回。请求返回一个包含3个集合的模型。最重的收集需要大约2秒的时间来处理,它们都是独立的。我想尝试在请求中并行运行它们,但我尝试过的一切似乎都不起作用。我看到的是tomcat处理了最初的几个请求,但很快它就停止了 以下是Iv'e的尝试: 我有一个实用程序,它接受Callable,在一个相当大的执行器上运行它们,并返回FutureTasks public class Async { public static boole
public class Async {
public static boolean active = true;
private static ExecutorService exe = active ? Executors.newFixedThreadPool(50) : null;
public static FutureTask run(Callable callable) throws Exception {
FutureTask f = new FutureTask(callable);
if (active) {
exe.execute(f);
} else {
f.run();
}
return f;
}
}
我是这样用的:
@RequestMapping("/test")
public
@ResponseBody
MessageDto authenticate(HttpServletRequest request, HttpServletResponse response) throws Exception {
final Map<String, Object> responseMap = new HashMap<String, Object>();
FutureTask future1 = Async.run(new Callable() {
@Override
public Object call() throws Exception {
try {
[SOME PROCESS THAT TAKES ABOUT 2 SECS]
} catch (Exception ex) {
LOG.error(ex);
}
return null; //To change body of implemented methods use File | Settings | File Templates.
}
});
FutureTask future2 = Async.run(new Callable() {
@Override
public Object call() throws Exception {
try {
[SOME PROCESS THAT TAKES ABOUT 2 SECS]
} catch (Exception ex) {
LOG.error(ex);
}
return null; //To change body of implemented methods use File | Settings | File Templates.
}
});
FutureTask future3 = Async.run(new Callable() {
@Override
public Object call() throws Exception {
try {
[SOME PROCESS THAT TAKES ABOUT 1 SEC]
} catch (Exception ex) {
LOG.error(ex);
}
return null; //To change body of implemented methods use File | Settings | File Templates.
}
});
future1.get();
future2.get();
future3.get();
return new MessageDto(responseMap);
}
我也尝试过使用Spring的@Async,但结果相同,服务器卡住了。
请帮忙
谢谢你。问得好!看看本教程,我认为Spring线程池+Spring非托管bean示例的第二种方式应该适合您。我已经做过类似的事情了。您还应该研究自Servlet3.0以来的servlet异步处理。