本文主要研究一下tomcat的connection-timeout

ServerProperties.Tomcat

org/springframework/boot/autoconfigure/web/ServerProperties.java

public static class Tomcat {

/**

* Access log configuration.

*/

private final Accesslog accesslog = new Accesslog();

/**

* Thread related configuration.

*/

private final Threads threads = new Threads();

/**

* Tomcat base directory. If not specified, a temporary directory is used.

*/

private File basedir;

/**

* Delay between the invocation of backgroundProcess methods. If a duration suffix

* is not specified, seconds will be used.

*/

@DurationUnit(ChronoUnit.SECONDS)

private Duration backgroundProcessorDelay = Duration.ofSeconds(10);

/**

* Maximum size of the form content in any HTTP post request.

*/

private DataSize maxHttpFormPostSize = DataSize.ofMegabytes(2);

/**

* Maximum amount of request body to swallow.

*/

private DataSize maxSwallowSize = DataSize.ofMegabytes(2);

/**

* Whether requests to the context root should be redirected by appending a / to

* the path. When using SSL terminated at a proxy, this property should be set to

* false.

*/

private Boolean redirectContextRoot = true;

/**

* Whether HTTP 1.1 and later location headers generated by a call to sendRedirect

* will use relative or absolute redirects.

*/

private boolean useRelativeRedirects;

/**

* Character encoding to use to decode the URI.

*/

private Charset uriEncoding = StandardCharsets.UTF_8;

/**

* Maximum number of connections that the server accepts and processes at any

* given time. Once the limit has been reached, the operating system may still

* accept connections based on the "acceptCount" property.

*/

private int maxConnections = 8192;

/**

* Maximum queue length for incoming connection requests when all possible request

* processing threads are in use.

*/

private int acceptCount = 100;

/**

* Maximum number of idle processors that will be retained in the cache and reused

* with a subsequent request. When set to -1 the cache will be unlimited with a

* theoretical maximum size equal to the maximum number of connections.

*/

private int processorCache = 200;

/**

* Comma-separated list of additional patterns that match jars to ignore for TLD

* scanning. The special '?' and '*' characters can be used in the pattern to

* match one and only one character and zero or more characters respectively.

*/

private List additionalTldSkipPatterns = new ArrayList<>();

/**

* Comma-separated list of additional unencoded characters that should be allowed

* in URI paths. Only "< > [ \ ] ^ ` { | }" are allowed.

*/

private List relaxedPathChars = new ArrayList<>();

/**

* Comma-separated list of additional unencoded characters that should be allowed

* in URI query strings. Only "< > [ \ ] ^ ` { | }" are allowed.

*/

private List relaxedQueryChars = new ArrayList<>();

/**

* Amount of time the connector will wait, after accepting a connection, for the

* request URI line to be presented.

*/

private Duration connectionTimeout;

/**

* Static resource configuration.

*/

private final Resource resource = new Resource();

/**

* Modeler MBean Registry configuration.

*/

private final Mbeanregistry mbeanregistry = new Mbeanregistry();

/**

* Remote Ip Valve configuration.

*/

private final Remoteip remoteip = new Remoteip();

//......

}

springboot的ServerProperties.Tomcat定义了connectionTimeout属性,用于指定接受连接之后等待uri的时间

customizeConnectionTimeout

org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java

private void customizeConnectionTimeout(ConfigurableTomcatWebServerFactory factory, Duration connectionTimeout) {

factory.addConnectorCustomizers((connector) -> {

ProtocolHandler handler = connector.getProtocolHandler();

if (handler instanceof AbstractProtocol) {

AbstractProtocol protocol = (AbstractProtocol) handler;

protocol.setConnectionTimeout((int) connectionTimeout.toMillis());

}

});

}

customizeConnectionTimeout将connectionTimeout写入到AbstractProtocol

AbstractProtocol

org/apache/coyote/AbstractProtocol.java

public void setConnectionTimeout(int timeout) {

endpoint.setConnectionTimeout(timeout);

}

AbstractProtocol将timeout设置到endpoint

AbstractEndpoint

org/apache/tomcat/util/net/AbstractEndpoint.java

public void setConnectionTimeout(int soTimeout) {

socketProperties.setSoTimeout(soTimeout);

}

/**

* Keepalive timeout, if not set the soTimeout is used.

*/

private Integer keepAliveTimeout = null;

public int getKeepAliveTimeout() {

if (keepAliveTimeout == null) {

return getConnectionTimeout();

} else {

return keepAliveTimeout.intValue();

}

}

AbstractEndpoint将timeout设置到socketProperties的soTimeout,另外它的getKeepAliveTimeout方法在keepAliveTimeout为null的时候,使用的是getConnectionTimeout

Http11Processor

org/apache/coyote/http11/Http11Processor.java

public SocketState service(SocketWrapperBase socketWrapper)

throws IOException {

RequestInfo rp = request.getRequestProcessor();

rp.setStage(org.apache.coyote.Constants.STAGE_PARSE);

// Setting up the I/O

setSocketWrapper(socketWrapper);

// Flags

keepAlive = true;

openSocket = false;

readComplete = true;

boolean keptAlive = false;

SendfileState sendfileState = SendfileState.DONE;

while (!getErrorState().isError() && keepAlive && !isAsync() && upgradeToken == null &&

sendfileState == SendfileState.DONE && !protocol.isPaused()) {

// Parsing the request header

try {

if (!inputBuffer.parseRequestLine(keptAlive, protocol.getConnectionTimeout(),

protocol.getKeepAliveTimeout())) {

if (inputBuffer.getParsingRequestLinePhase() == -1) {

return SocketState.UPGRADING;

} else if (handleIncompleteRequestLineRead()) {

break;

}

}

//......

}

//......

}

//......

}

Http11Processor的service方法在执行inputBuffer.parseRequestLine时传入了keptAlive、protocol.getConnectionTimeout()、protocol.getKeepAliveTimeout()参数

小结

springboot提供了tomcat的connection-timeout参数配置,其配置的是socket timeout,不过springboot没有提供对keepAliveTimeout的配置,它默认是null,读取的是connection timeout的配置。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: