Controller层使用了Callable需要配置WebMvcConfigurer支持异步并发

问题:

2018-09-19 00:43:58.434 WARN 10104 --- [ XNIO-2 task-28] o.s.w.c.request.async.WebAsyncManager : !!! An Executor is required to handle java.util.concurrent.Callable return values. Please, configure a TaskExecutor in the MVC config under "async support". The SimpleAsyncTaskExecutor currently in use is not suitable under load.

原因:

Controller层使用了Callable返回结果,上下文没有配置异步线程池引起的。

解决方案:

@Configuration
@EnableAsync
public class AsyncConfig  implements AsyncConfigurer {

    @Bean
    protected WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
                configurer.setTaskExecutor(getTaskExecutor());
            }
        };
    }

    @Bean
    protected ConcurrentTaskExecutor getTaskExecutor() {
        return new ConcurrentTaskExecutor(Executors.newFixedThreadPool(5));
    }
}

Spring 配置在这方面有点令人困惑,因为它需要单独配置 MVC 异步支持,即使用返回 Callable 的控制器处理程序方法,以及使用 @Async 注释的任何 Spring bean 方法。要正确配置它,您可以应用类似下面的配置,记住 AsyncTaskExecutor 配置可能需要修改。

附带说明一下,您可能会想简单地使用 @Async 注释您的控制器处理程序方法。这只会产生预期的效果 - 释放 Web 服务器线程 - 触发和忘记操作(此观察基于 Spring Boot 2.1.2,他们可能会在未来解决这个问题)。如果您想利用 Servlet 3.0 异步处理的强大功能,您真的必须使用 Callables 并使用 WebMvcConfigurer 配置它们。

原文 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MVCCallable 都是 Java Web 应用程序中常用的概念。MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。Callable 是一个 Java 接口,用于在后台执行异步任务。 在 Spring MVC 中,可以使用 Callable 接口来实现异步处理请求。当处理器方法返回一个 Callable 对象时,Spring MVC 将调用它的 call() 方法,并将其提交到一个 TaskExecutor 中执行。在处理完成后,Callable 对象将返回一个包含结果的 Future 对象,Spring MVC使用它来渲染响应。 在 Web 应用程序中,使用 Callable 接口可以提高系统的并发性能。由于处理请求的线程不会一直阻塞等待响应返回,因此可以释放资源以处理其他请求。 要使用 Callable 接口实现异步处理,请将处理器方法的返回类型设置为 Callable 类型,如下所示: ``` @RequestMapping("/async") public Callable<String> asyncHandler() { Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { // 执行异步任务 return "result"; } }; return callable; } ``` 在上面的示例中,处理器方法 asyncHandler() 返回一个 Callable 对象。在 call() 方法中,可以执行任何需要异步处理的任务。当任务执行完成后,将返回一个包含结果的字符串。 需要注意的是,要使用 Callable 接口实现异步处理,需要配置文件中配置 TaskExecutor。例如,可以使用以下配置: ``` @Configuration @EnableAsync public class AppConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(100); executor.setQueueCapacity(50); executor.setThreadNamePrefix("MyExecutor-"); executor.initialize(); return executor; } } ``` 在上面的示例中,配置了一个名为 MyExecutor 的线程池,用于执行异步任务。在处理器方法中返回 Callable 对象时,Spring MVC使用该线程池执行任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值