Асинхронное предупреждение о создании 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

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

Вам нужно настроить исполнителя задач, как уже описано 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());
  }
}
Другие вопросы по тегам