在使用嵌入式 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
但这并没有任何效果。
编辑:
我曾尝试按照 Andrei 的建议实现 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。
我有什么遗漏吗?
最佳答案
在 SpringApplication(首先实现名为 AsyncConfigurer
的接口(interface))类中,我将创建自定义 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;
}
您可以在 application.properties 文件中配置 poolSize
、maxSize
等,然后使用 @Value 注解“注入(inject)”它们。
关于java - Spring 启动: how to set Async timeout when deploying to an external server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016943/