tomcat connection-timeout連接超時(shí)源碼解析
序
本文主要研究一下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<String> additionalTldSkipPatterns = new ArrayList<>(); /** * Comma-separated list of additional unencoded characters that should be allowed * in URI paths. Only "< > [ \ ] ^ ` { | }" are allowed. */ private List<Character> relaxedPathChars = new ArrayList<>(); /** * Comma-separated list of additional unencoded characters that should be allowed * in URI query strings. Only "< > [ \ ] ^ ` { | }" are allowed. */ private List<Character> 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的時(shí)間
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寫(xiě)入到AbstractProtocol
AbstractProtocol
org/apache/coyote/AbstractProtocol.java
public void setConnectionTimeout(int timeout) { endpoint.setConnectionTimeout(timeout); }
AbstractProtocol將timeout設(shè)置到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設(shè)置到socketProperties的soTimeout,另外它的getKeepAliveTimeout方法在keepAliveTimeout為null的時(shí)候,使用的是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方法在執(zhí)行inputBuffer.parseRequestLine時(shí)傳入了keptAlive、protocol.getConnectionTimeout()、protocol.getKeepAliveTimeout()參數(shù)
小結(jié)
springboot提供了tomcat的connection-timeout參數(shù)配置,其配置的是socket timeout,不過(guò)springboot沒(méi)有提供對(duì)keepAliveTimeout的配置,它默認(rèn)是null,讀取的是connection timeout的配置。
以上就是tomcat connection-timeout連接超時(shí)源碼解析的詳細(xì)內(nèi)容,更多關(guān)于tomcat connection-timeout連接超時(shí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot攔截器和過(guò)濾器實(shí)例解析
這篇文章主要介紹了Spring Boot攔截器和過(guò)濾器實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01簡(jiǎn)單易用的Spring?Boot郵件發(fā)送demo
本文將介紹如何使用Spring?Boot發(fā)送郵件,我們將演示如何配置SMTP郵件服務(wù)器,創(chuàng)建一個(gè)郵件模板,以及如何使用JavaMailSender發(fā)送郵件,我們還將介紹如何測(cè)試我們的郵件發(fā)送代碼2023-12-12Spring定時(shí)任務(wù)使用及如何使用郵件監(jiān)控服務(wù)器
這篇文章主要介紹了Spring定時(shí)任務(wù)使用及如何使用郵件監(jiān)控服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07SpringBoot程序的打包與運(yùn)行的實(shí)現(xiàn)
本文主要介紹了SpringBoot程序的打包與運(yùn)行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06