Spring Boot: как установить асинхронный тайм-аут при развертывании на внешний сервер

#java #spring #asynchronous #spring-boot

#java #spring #асинхронный #spring-boot

Вопрос:

При использовании встроенного tomcat для развертывания моего приложения spring boot я устанавливаю тайм-аут асинхронности следующим образом:

 @Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {

        @Override
        public void customize(Connector connector) {
            connector.setAsyncTimeout(60000);
        }
    });
    return factory;
}
  

Но как добиться того же при развертывании на внешний сервер, например, websphere?

Пробовал использовать свойство:

spring.mvc.async.request-timeout= 600000

Но это не возымело никакого эффекта.

Редактировать:

Я попытался реализовать AsyncConfigurer в соответствии с предложением Андрея. Но это сработало не так, как ожидалось. Ниже приведен мой класс конфигурации:

 @SpringBootApplication
@EnableAsync
 public class Application implements AsyncConfigurer {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Override
public Executor getAsyncExecutor() {
    Executor executor = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10),
            new ThreadPoolExecutor.AbortPolicy());
    return executor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    // TODO Auto-generated method stub
    return new SimpleAsyncUncaughtExceptionHandler();
}
 }
  

Я указал тайм-аут в 60 секунд, но при попытке выполнить эту конфигурацию время ожидания запроса истекло через 30 секунд. Использовал RestClient.

Есть ли что-то, чего мне не хватает?

Ответ №1:

В классе SpringApplication (сначала реализовать вызываемый интерфейс AsyncConfigurer ) я бы создал свой пользовательский AsyncExeuctor следующим образом:

     @Override
    public Executor getAsyncExecutor() {
        Executor executor = new ThreadPoolExecutor(
                poolSize,
                maxSize,
                keepAlive, 
                TimeUnit.SECONDS, // <--- TIMEOUT IN SECONDS 
                new ArrayBlockingQueue<>(qSize),
                new ThreadPoolExecutor.AbortPolicy() // <-- It will abort if timeout exceeds
        );
        return executor;
    }
  

Вы можете настроить poolSize , maxSize , и т.д. в файле application.properties, а затем «внедрить» их, используя аннотацию @Value .

Комментарии:

1. Есть ли способ сделать это способом весенней загрузки, я имею в виду не реализацию AsynCConfigurer, а прямое написание некоторой конфигурации в классе, помеченном @SpringBootApplication ?

2. @bidishamukherjee Фрагмент кода взят из класса, отмеченного знаком @SpringBootApplication . Этот класс должен реализовать AsyncConfigurer.

3. Хорошо, понял. Но можете ли вы также пролить некоторый свет на то, почему настройка свойства spring.mvc.async.request-timeout не сработала? Спасибо за уже данный ответ.

4. @bidishamukherjee Я не знаю об этом свойстве… Я никогда не использовал его.

5. Пробовал свой способ, но у меня это не сработало. Добавлен мой класс конфигурации. Не могли бы вы взглянуть?