如何使用Spring Boot和嵌入式Tomcat配置此属性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Spring Boot和嵌入式Tomcat配置此属性?相关的知识,希望对你有一定的参考价值。

我是否在application.properties文件中配置了像connectionTimeout这样的属性,或者在其他地方配置它?我无法从谷歌那里得知这一点。

Tomcat properties list

我发现这个Spring-Boot example,但它不包含connectionTimeout属性,当我在我的application.properties文件中设置server.tomcat.connectionTimeout=60000时,我收到一个错误。

答案

Spring Boot 1.4及更高版本

从Spring Boot 1.4开始,您可以使用属性server.connection-timeout。请参阅Spring Boot的common application properties

Spring Boot 1.3及更早版本

提供定制的EmbeddedServletContainerFactory bean:

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

    factory.addConnectorCustomizers(connector -> 
            ((AbstractProtocol) connector.getProtocolHandler()).setConnectionTimeout(10000));

    // configure some more properties

    return factory;
}

如果您不使用Java 8或不想使用Lambda Expressions,请像这样添加TomcatConnectorCustomizer

    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
        @Override
        public void customize(Connector connector) {
            ((AbstractProtocol) connector.getProtocolHandler()).setConnectionTimeout(10000);
        }
    });

setConnectionTimeout()方法需要以毫秒为单位的超时(请参阅connectionTimeout中的Apache Tomcat 8 Configuration Reference)。

另一答案

我更喜欢在服务器启动之前设置一组系统属性:

/**
 * Start SpringBoot server
 */
@SpringBootApplication(scanBasePackages= {"com.your.conf.package"})
//@ComponentScan(basePackages = "com.your.conf.package")
public class Application {
    public static void main(String[] args) throws Exception {
        System.setProperty("server.port","8132"));
        System.setProperty("server.tomcat.max-threads","200");
        System.setProperty("server.connection-timeout","60000");
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }
}
另一答案

在spring boot 2.x及更高版本之后,嵌入tomcat的实现方法已经改变。

请参阅下面的代码。

import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Configuration
public class TomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Autowired
    private ContainerProperties containerProperties;

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers(connector -> {
            AbstractHttp11Protocol protocol = (AbstractHttp11Protocol) connector.getProtocolHandler();

            protocol.setMaxKeepAliveRequests(10);


            log.info("####################################################################################");
            log.info("#");
            log.info("# TomcatCustomizer");
            log.info("#");
            log.info("# custom maxKeepAliveRequests {}", protocol.getMaxKeepAliveRequests());
            log.info("# origin keepalive timeout: {} ms", protocol.getKeepAliveTimeout());
            log.info("# keepalive timeout: {} ms", protocol.getKeepAliveTimeout());
            log.info("# connection timeout: {} ms", protocol.getConnectionTimeout());
            log.info("# max connections: {}", protocol.getMaxConnections());
            log.info("#");
            log.info(
                "####################################################################################");

        });
    }
}
另一答案

它实际上应该是你的server.connection-timeout中的application.propertiesReference,我建议你给它添加书签。

以上是关于如何使用Spring Boot和嵌入式Tomcat配置此属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中关闭嵌入式 Tomcat?

如何使用 Spring Boot 嵌入式 tomcat 设置会话超时

如何使用嵌入式 tomcat 会话集群设置 Spring Boot 应用程序?

Spring Boot如何启动嵌入式Tomcat?

Spring Boot如何使用内嵌式的Tomcat和Jetty?

如何知道spring boot中嵌入了哪个tomcat版本