4

我正在使用 Spring Boot 应用程序。我有一个返回 Callable 的休息控制器。

@GetMapping("/fb-roles")
@Timed
public Callable<List<FbRole>> getAllFbRoles() {
    log.debug("REST request to get all FbRoles");
    return (() -> { return fbRoleRepository.findAll(); });
}

一个 ThreadPoolTask​​Executor 配置如下:

@Configuration
@EnableAsync
@EnableScheduling
public class AsyncConfiguration implements AsyncConfigurer {

private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class);

private final JHipsterProperties jHipsterProperties;

public AsyncConfiguration(JHipsterProperties jHipsterProperties) {
    this.jHipsterProperties = jHipsterProperties;
}

@Override
@Bean(name = "taskExecutor")
public Executor getAsyncExecutor() {
    log.debug("Creating Async Task Executor");
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(jHipsterProperties.getAsync().getCorePoolSize());
    executor.setMaxPoolSize(jHipsterProperties.getAsync().getMaxPoolSize());
    executor.setQueueCapacity(jHipsterProperties.getAsync().getQueueCapacity());
    executor.setThreadNamePrefix("fb-quiz-Executor-");
    return new ExceptionHandlingAsyncTaskExecutor(executor);
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new SimpleAsyncUncaughtExceptionHandler();
}

}

2018-09-19 00:43:58.434 WARN 10104 --- [XNIO-2 task-28] oswcrequest.async.WebAsyncManager : !!! 需要一个 Executor 来处理 java.util.concurrent.Callable 返回值。请在“异步支持”下的 MVC 配置中配置一个 TaskExecutor。当前使用的 SimpleAsyncTaskExecutor 在负载下不适合。

但是在访问 api 服务器时会产生以下警告

4

4 回答 4

9

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

@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));
    }
}

附带说明一下,您可能会想简单地用@Async. 这只会产生预期的效果 - 释放 Web 服务器线程 - on fire and forget 操作(此观察基于 Spring Boot 2.1.2,他们可能会在未来解决这个问题)。如果您想利用Servlet 3.0 异步处理的强大功能,您确实必须Callables使用WebMvcConfigurer.

于 2019-02-03T11:23:21.890 回答
2

鉴于警告和您的Callable方法。

似乎 Spring 无法识别Executor您刚刚在配置类中设置的 bean。

您可能需要注释您的方法并指定执行程序 bean 名称,所以

@GetMapping("/fb-roles")
@Timed
@Async("taskExecutor")
public Callable<List<FbRole>> getAllFbRoles() {
    log.debug("REST request to get all FbRoles");
    return (() -> { return fbRoleRepository.findAll(); });
}

希望这可以帮助

指南可以在这里找到:https ://www.baeldung.com/spring-async

于 2018-09-19T05:51:16.203 回答
1

我结合了 mvc 配置(xml + 注释),对我来说,以下配置有助于修复该警告:

mvc-servlet.xml:

<mvc:annotation-driven> 
  <mvc:async-support default-timeout="30000" task-executor="taskExecutor"
</mvc:annotation-driven>

异步配置.java

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
  @Bean
  public AsyncTaskExecutor taskExecutor() {
    return new ConcurrentTaskExecutor(Executors.newCachedThreadPool());
  }
}
于 2019-12-27T10:26:03.200 回答
1

从您的警告“请在“异步支持”下的 MVC 配置中配置一个 TaskExecutor 。当前使用的 SimpleAsyncTaskExecutor 不适合负载。

我想知道你是否使用spring mvc?

使用 MVC,以下几个链接可能会有所帮助:

springboot应用中配置mvc异步任务执行器

Spring Boot - 设置 TaskExecutor 的任何快捷方式?

于 2018-09-19T04:44:00.890 回答