龙空技术网

聊聊tomcat的connection-timeout

码匠乱炖 44

前言:

今天兄弟们对“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的配置。

标签: #tomcat sockettimeout #inet_e_connection_timeout怎么解决