java - Spring 启动: how to set Async timeout when deploying to an external server

标签 java spring asynchronous 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

但这并没有任何效果。

编辑:

我曾尝试按照 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 文件中配置 poolSizemaxSize 等,然后使用 @Value 注解“注入(inject)”它们。

关于java - Spring 启动: how to set Async timeout when deploying to an external server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016943/

相关文章:

java - 在 Zuul 预过滤器中修改请求正文不起作用

php - 如何在 laravel 中异步执行事件

Java:Printf(%.2f,arg) 显示 f$ff 而不是 f.ff。什么可能导致这种情况?

java - 如何告诉 Eclipse 为所有项目包含标准 .jar 库

hibernate - 仅创建和清理数据库设置一次以测试所有 DAO

java - "org.hibernate.TransactionException: nested transactions not supported"但我没有嵌套事务

javascript - 如何使用多个 XMLHttpRequest.responseText 值?

c# - 使用 C# 5.0 异步读取文件

java - 正则表达式返回方括号之间的字符(但不是括号)

Java:更好的客户端/服务器消息交换方法?