#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. Пробовал свой способ, но у меня это не сработало. Добавлен мой класс конфигурации. Не могли бы вы взглянуть?