如何为每个控制器

时间:2017-09-26 08:20:28

标签: java spring asynchronous

在我们的项目中,我们在不同的Controller中有一些异步请求,这些请求由不同的执行程序运行,其中一些是在执行程序之间共享的,一些是特定于某些执行程序的。

async请求的含义是:该方法返回DeferredResult,由某个执行程序运行的任务填充。

目前,他们中的一些人从方法参数直接将大量数据(不存储在RAM中)写入OutputStream,这是我们想要防止的,因为它似乎会导致数据损坏。

我发现这样做的唯一合适的方法是从控制器的方法返回StreamingResponseBody。但在这种情况下,我无法分配一些特定的执行程序,它将执行给定执行程序的任务。我可以通过设置我自己的asyncBean来更改公共执行程序,但这只会给我一个执行程序,而我想为各种任务设置多个执行程序。

1 个答案:

答案 0 :(得分:0)

如果你想要任何动作的不同执行者,你可以通过在WebAsyncTask

中包装return callable来实现
@Controller
public class MyWebController3 {

    @RequestMapping("/test3")
    public
    @ResponseBody
    WebAsyncTask<String> handleRequest (HttpServletRequest r) {
        System.out.println("asyncSupported: " + r.isAsyncSupported());
        System.out.println(Thread.currentThread().getName());

        Callable<String> callable = () -> {
            System.out.println(Thread.currentThread().getName());
            return "WebAsyncTask test";
        };

        //Use any task executor here
        ConcurrentTaskExecutor t = new ConcurrentTaskExecutor(
                  Executors.newFixedThreadPool(1));

        return new WebAsyncTask<>(10000L, t, callable);
    }
}

了解详情herehere