Асинхронное предупреждение о создании API REST - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю с загрузочным приложением 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 ПРЕДУПРЕЖДЕНИЕ 10104 --- [XNIO-2 task-28] oswcrequest.async.WebAsyncManager: !!!Исполнитель обязан обрабатывать возвращаемые значения java.util.concurrent.Callable.Пожалуйста, настройте TaskExecutor в конфигурации MVC в разделе «Асинхронная поддержка».SimpleAsyncTaskExecutor, который в настоящее время используется, не подходит под нагрузкой.

Но при доступе к серверу API выдается следующее предупреждение

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

С учетом предупреждения и вашего метода Callable.

Похоже, Spring не может определить компонент Executor, который вы только что установили в своем классе конфигурации.

Youвозможно, потребуется аннотировать ваш метод и указать имя компонента-исполнителя, поэтому

@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

0 голосов
/ 03 февраля 2019

Конфигурация 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.

0 голосов
/ 19 сентября 2018

Из вашего предупреждения "Пожалуйста, настройте TaskExecutor в конфигурации MVC в разделе" async support ". SimpleAsyncTaskExecutor, который в настоящее время используется, не подходит под нагрузкой."

Интересно, если выИспользовать Spring MVC или нет?

С MVC могут помочь несколько ссылок ниже:

Конфигурирование асинхронного исполнителя mvc в приложении Springboot

Spring Boot - есть ли ярлыки для настройки TaskExecutor?

...