如何使用 Spring 引导和嵌入式 Tomcat 配置此 属性?
How do I configure this property with Spring Boot and an embedded Tomcat?
我是在 application.properties 文件中配置 connectionTimeout 等属性还是在其他地方配置?我无法从 Google.
中弄清楚这一点
我找到了这个 Spring-Boot example,但它不包含连接超时 属性,当我在我的 application.properties 文件中设置 server.tomcat.connectionTimeout=60000
时,我收到错误消息。
Spring 引导 1.4 及更高版本
从 Spring Boot 1.4 开始,您可以使用 属性 server.connection-timeout
。请参阅 Spring 引导的 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()
方法需要以毫秒为单位的超时(请参阅 Apache Tomcat 8 Configuration Reference 中的 connectionTimeout
)。
我更喜欢在服务器启动前设置系统属性:
/**
* 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);
}
}
在您的 application.properties
中 实际上 应该是 server.connection-timeout
。 Reference,建议收藏。
spring 启动后 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(
"####################################################################################");
});
}
}
我是在 application.properties 文件中配置 connectionTimeout 等属性还是在其他地方配置?我无法从 Google.
中弄清楚这一点我找到了这个 Spring-Boot example,但它不包含连接超时 属性,当我在我的 application.properties 文件中设置 server.tomcat.connectionTimeout=60000
时,我收到错误消息。
Spring 引导 1.4 及更高版本
从 Spring Boot 1.4 开始,您可以使用 属性 server.connection-timeout
。请参阅 Spring 引导的 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()
方法需要以毫秒为单位的超时(请参阅 Apache Tomcat 8 Configuration Reference 中的 connectionTimeout
)。
我更喜欢在服务器启动前设置系统属性:
/**
* 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);
}
}
在您的 application.properties
中 实际上 应该是 server.connection-timeout
。 Reference,建议收藏。
spring 启动后 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(
"####################################################################################");
});
}
}