Spring Boot:部署到外部服务器时如何设置异步超时

Posted

技术标签:

【中文标题】Spring Boot:部署到外部服务器时如何设置异步超时【英文标题】:Spring Boot: how to set Async timeout when deploying to an external server 【发布时间】:2017-02-22 08:06:57 【问题描述】:

在使用嵌入式 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。

我有什么遗漏吗?

【问题讨论】:

【参考方案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;
    

您可以在application.properties文件中配置poolSizemaxSize等,然后使用@Value注解“注入”它们。

【讨论】:

有没有办法以Spring Boot方式做到这一点,我的意思是不实现AsynCConfigurer,直接在标有@SpringBootApplication的类中编写一些配置? @bidishamukherjee 代码 sn-p 来自标有@SpringBootApplication 的类。该类需要实现 AsyncConfigurer。 好的,知道了。但是你能否解释一下为什么设置 spring.mvc.async.request-timeout 属性不起作用?感谢您已经给出的答案。 @bidishamukherjee 我不知道这个属性...我从未使用过它。 试过你的方法,但它对我不起作用。添加了我的配置类。你能看一下吗?

以上是关于Spring Boot:部署到外部服务器时如何设置异步超时的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot在部署到Tomcat期间无法加载外部jar

当部署在外部服务器上作为战争时,spring boot 是使用外部服务器还是嵌入式服务器?

如何将外部jar文件传递给spring boot项目? [复制]

Spring boot 1.4登录外部tomcat

如何设置 spring-boot 以允许从外部 IP 地址访问网络服务器

Spring BootSpring Boot项目部署到外部Tomcat容器