前言:
今天兄弟们对“tomcat sockettimeout”大概比较关怀,看官们都需要了解一些“tomcat sockettimeout”的相关知识。那么小编在网上收集了一些对于“tomcat sockettimeout””的相关文章,希望同学们能喜欢,同学们快快来了解一下吧!序
本文主要研究一下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的时间
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的配置。