Java Spring控制器内部的异步处理

Java 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

我有一个请求处理程序,它在内部执行一些繁重的操作,大约需要5秒钟才能返回。请求返回一个包含3个集合的模型。最重的收集需要大约2秒的时间来处理,它们都是独立的。我想尝试在请求中并行运行它们,但我尝试过的一切似乎都不起作用。我看到的是tomcat处理了最初的几个请求,但很快它就停止了

以下是Iv'e的尝试:

我有一个实用程序,它接受Callable,在一个相当大的执行器上运行它们,并返回FutureTasks

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异步处理。