异步REST API生成警告

时间:2018-09-19 03:50:00

标签: spring spring-mvc spring-boot jhipster spring-async

我正在使用Spring引导应用程序。我有一个休息控制器,返回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警告10104 --- [XNIO-2 task-28] o.s.w.c.request.async.WebAsyncManager:   !!!   需要执行程序来处理java.util.concurrent.Callable返回值。   请在“异步支持”下的MVC配置中配置TaskExecutor。   当前使用的SimpleAsyncTaskExecutor在负载下不适合使用。

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

4 个答案:

答案 0 :(得分:2)

Spring配置在这方面有点令人困惑,因为它需要对MVC异步支持进行单独的配置,即使用返回Callable的Controller处理程序方法以及任何用{{1}注释的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)); } } 来简单地注释Controller处理程序方法。这只会在火灾和忘记操作上产生预期的效果-释放Web服务器线程(此观察基于Spring Boot 2.1.2,将来可能会解决此问题)。如果您想利用 Servlet 3.0异步处理的功能,您确实必须使用@Async并将其配置为Callables

答案 1 :(得分:1)

给出警告和您的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

答案 2 :(得分:0)

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

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

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

Configuring mvc async task executor in springboot application

Spring Boot - Any shortcuts for setting TaskExecutor?

答案 3 :(得分:0)

我组合了mvc配置(xml +注释),对我而言,以下配置有助于解决该警告:

mvc-servlet.xml:

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

AsyncConfig.java

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
  @Bean
  public AsyncTaskExecutor taskExecutor() {
    return new ConcurrentTaskExecutor(Executors.newCachedThreadPool());
  }
}