我应该在application.properties文件中配置连接超时等属性,还是有其他更好的方式?我在谷歌上找不到答案。
我找到了这个Spring-Boot示例,但它没有包含connectionTimeout属性。当我在application.properties文件中设置server.tomcat.connectionTimeout=60000
时,出现错误。
我应该在application.properties文件中配置连接超时等属性,还是有其他更好的方式?我在谷歌上找不到答案。
我找到了这个Spring-Boot示例,但它没有包含connectionTimeout属性。当我在application.properties文件中设置server.tomcat.connectionTimeout=60000
时,出现错误。
从Spring Boot 1.4开始,您可以使用属性server.connection-timeout
。请参见Spring Boot的常用应用程序属性。
提供一个自定义的EmbeddedServletContainerFactory
bean:
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(connector ->
((AbstractProtocol) connector.getProtocolHandler()).setConnectionTimeout(10000));
// configure some more properties
return factory;
}
TomcatConnectorCustomizer
: factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
((AbstractProtocol) connector.getProtocolHandler()).setConnectionTimeout(10000);
}
});
< p > setConnectionTimeout()
方法期望以毫秒为单位的超时时间(请参见 Apache Tomcat 8 配置参考 中的 connectionTimeout
)。< /p >
@ConditionalOnClass({ Servlet.class, Tomcat.class })
注释生成EmbeddedServletContainerFactory
bean的@Configuration
类。请参见EmbeddedServletContainerAutoConfiguration。 - hzpz在服务器启动之前,我更喜欢设置系统属性的集合:
/**
* 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);
}
}
Original Answer:最初的回答。
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
文件中设置server.connection-timeout
。参考文献,我建议你将其加入书签。
server.connection-timeout
属性时,必须指定单位,否则不会生效。例如,您可以使用 server.connection-timeout=5000ms
或 server.connection-timeout=5s
来设置 5 秒的超时时间。但是您不能只写 server.connection-timeout=5000
,这是无效的。 - MiguelMunoz