Асинхронное предупреждение о создании API REST
Я работаю с загрузочным приложением Spring. У меня есть контроллер отдыха, который возвращает Callable.
@GetMapping("/fb-roles")
@Timed
public Callable<List<FbRole>> getAllFbRoles() {
log.debug("REST request to get all FbRoles");
return (() -> { return fbRoleRepository.findAll(); });
}
ThreadPoolTaskExecutor настраивается следующим образом:
@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:!!! Исполнитель обязан обрабатывать возвращаемые значения java.util.concurrent.Callable. Пожалуйста, настройте TaskExecutor в конфигурации MVC в разделе "Асинхронная поддержка". Используемый в настоящее время SimpleAsyncTaskExecutor не подходит под нагрузкой.
Но при доступе к серверу API выдает следующее предупреждение
5 ответов
Конфигурация Spring немного сбивает с толку в этом отношении, поскольку требует отдельной конфигурации для поддержки асинхронного MVC, то есть с использованием метода обработчика контроллера, который возвращает Callable
и для любого метода bean-компонента Spring, помеченного как @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
, Это будет иметь только желаемый эффект - освобождение потоков веб-сервера - при запуске и операциях забывания (это наблюдение основано на Spring Boot 2.1.2, возможно, они решат эту проблему в будущем). Если вы хотите использовать возможности Servlet 3.0 Asynchronous Processing, вы действительно должны использовать Callables
и настроить их с WebMvcConfigurer
,
Учитывая предупреждение и ваш Callable
метод.
Похоже, весна не может определить Executor
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
Из вашего предупреждения "Пожалуйста, настройте TaskExecutor в конфигурации MVC под" асинхронная поддержка ". SimpleAsyncTaskExecutor, используемый в настоящее время, не подходит под нагрузкой".
Интересно, вы используете пружинный MVC или нет?
С MVC, несколько ссылок ниже могут помочь:
Настройка исполнителя асинхронных задач mvc в приложении Springboot
Вам нужно настроить исполнителя задач, как уже описано Fritz. К сожалению, его решение использует устаревший WebMvcConfigurerAdapter.
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class AsyncWebMvcConfiguration implements WebMvcConfigurer{
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setTaskExecutor(asyncExecutor());
}
private AsyncTaskExecutor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.initialize();
return executor;
}
}
Улучшение решения от Fritz Duchardt и взято из: https://docs.sentry.io/platforms/java/guides/spring-boot/async/
Я объединил конфигурацию 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());
}
}