/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.util.net; import java.net.Socket; import java.net.SocketException; /** * Properties that can be set in the <Connector> element * in server.xml. All properties are prefixed with "socket." * and are currently only working for the Nio connector * * @author Filip Hanik */ public class SocketProperties { /** * Enable/disable key cache, this bounded cache stores * KeyAttachment objects to reduce GC * Default is 500 * -1 is unlimited * 0 is disabled */ protected int keyCache = 500; /** * Enable/disable socket processor cache, this bounded cache stores * SocketProcessor objects to reduce GC * Default is 500 * -1 is unlimited * 0 is disabled */ protected int processorCache = 500; /** * Enable/disable poller event cache, this bounded cache stores * PollerEvent objects to reduce GC for the poller * Default is 500 * -1 is unlimited * 0 is disabled * >0 the max number of objects to keep in cache. */ protected int eventCache = 500; /** * Enable/disable direct buffers for the network buffers * Default value is enabled */ protected boolean directBuffer = false; /** * Socket receive buffer size in bytes (SO_RCVBUF) * Default value is 25188 */ protected int rxBufSize = 25188; /** * Socket send buffer size in bytes (SO_SNDBUF) * Default value is 43800 */ protected int txBufSize = 43800; /** * The application read buffer size in bytes. * Default value is rxBufSize */ protected int appReadBufSize = 8192; /** * The application write buffer size in bytes * Default value is txBufSize */ protected int appWriteBufSize = 8192; /** * NioChannel pool size for the endpoint, * this value is how many channels * -1 means unlimited cached, 0 means no cache * Default value is 500 */ protected int bufferPool = 500; /** * Buffer pool size in bytes to be cached * -1 means unlimited, 0 means no cache * Default value is 100MB (1024*1024*100 bytes) */ protected int bufferPoolSize = 1024*1024*100; /** * TCP_NO_DELAY option, default is true */ protected boolean tcpNoDelay = true; /** * SO_KEEPALIVE option, default is false */ protected boolean soKeepAlive = false; /** * OOBINLINE option, default is true */ protected boolean ooBInline = true; /** * SO_REUSEADDR option, default is true */ protected boolean soReuseAddress = true; /** * SO_LINGER option, default is true, paired with the <code>soLingerTime</code> value */ protected boolean soLingerOn = true; /** * SO_LINGER option, default is 25 seconds. */ protected int soLingerTime = 25; /** * SO_TIMEOUT option, default is 5000 milliseconds */ protected int soTimeout = 5000; /** * Traffic class option, value between 0 and 255 * IPTOS_LOWCOST (0x02) * IPTOS_RELIABILITY (0x04) * IPTOS_THROUGHPUT (0x08) * IPTOS_LOWDELAY (0x10) * Default value is 0x04 | 0x08 | 0x010 */ protected int soTrafficClass = 0x04 | 0x08 | 0x010; /** * Performance preferences according to * http://docs.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) * Default value is 1 */ protected int performanceConnectionTime = 1; /** * Performance preferences according to * http://docs.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) * Default value is 0 */ protected int performanceLatency = 0; /** * Performance preferences according to * http://docs.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) * Default value is 1 */ protected int performanceBandwidth = 1; /** * The minimum frequency of the timeout interval to avoid the * poller going boinkers during high traffic */ protected long timeoutInterval = 1000; /** * Timeout in milliseconds for an unlock to take place. */ protected int unlockTimeout = 250; private Socket properties; public void setProperties(Socket socket) throws SocketException{ socket.setReceiveBufferSize(rxBufSize); socket.setSendBufferSize(txBufSize); socket.setOOBInline(ooBInline); socket.setKeepAlive(soKeepAlive); socket.setPerformancePreferences(performanceConnectionTime,performanceLatency,performanceBandwidth); socket.setReuseAddress(soReuseAddress); socket.setSoLinger(soLingerOn,soLingerTime); socket.setSoTimeout(soTimeout); socket.setTcpNoDelay(tcpNoDelay); socket.setTrafficClass(soTrafficClass); } public boolean getDirectBuffer() { return directBuffer; } public boolean getOoBInline() { return ooBInline; } public int getPerformanceBandwidth() { return performanceBandwidth; } public int getPerformanceConnectionTime() { return performanceConnectionTime; } public int getPerformanceLatency() { return performanceLatency; } public int getRxBufSize() { return rxBufSize; } public boolean getSoKeepAlive() { return soKeepAlive; } public boolean getSoLingerOn() { return soLingerOn; } public int getSoLingerTime() { return soLingerTime; } public boolean getSoReuseAddress() { return soReuseAddress; } public int getSoTimeout() { return soTimeout; } public int getSoTrafficClass() { return soTrafficClass; } public boolean getTcpNoDelay() { return tcpNoDelay; } public int getTxBufSize() { return txBufSize; } public int getBufferPool() { return bufferPool; } public int getBufferPoolSize() { return bufferPoolSize; } public int getEventCache() { return eventCache; } public int getKeyCache() { return keyCache; } public Socket getProperties() { return properties; } public int getAppReadBufSize() { return appReadBufSize; } public int getAppWriteBufSize() { return appWriteBufSize; } public int getProcessorCache() { return processorCache; } public long getTimeoutInterval() { return timeoutInterval; } public int getDirectBufferPool() { return bufferPool; } public void setPerformanceConnectionTime(int performanceConnectionTime) { this.performanceConnectionTime = performanceConnectionTime; } public void setTxBufSize(int txBufSize) { this.txBufSize = txBufSize; } public void setTcpNoDelay(boolean tcpNoDelay) { this.tcpNoDelay = tcpNoDelay; } public void setSoTrafficClass(int soTrafficClass) { this.soTrafficClass = soTrafficClass; } public void setSoTimeout(int soTimeout) { this.soTimeout = soTimeout; } public void setSoReuseAddress(boolean soReuseAddress) { this.soReuseAddress = soReuseAddress; } public void setSoLingerTime(int soLingerTime) { this.soLingerTime = soLingerTime; } public void setSoKeepAlive(boolean soKeepAlive) { this.soKeepAlive = soKeepAlive; } public void setRxBufSize(int rxBufSize) { this.rxBufSize = rxBufSize; } public void setPerformanceLatency(int performanceLatency) { this.performanceLatency = performanceLatency; } public void setPerformanceBandwidth(int performanceBandwidth) { this.performanceBandwidth = performanceBandwidth; } public void setOoBInline(boolean ooBInline) { this.ooBInline = ooBInline; } public void setDirectBuffer(boolean directBuffer) { this.directBuffer = directBuffer; } public void setSoLingerOn(boolean soLingerOn) { this.soLingerOn = soLingerOn; } public void setBufferPool(int bufferPool) { this.bufferPool = bufferPool; } public void setBufferPoolSize(int bufferPoolSize) { this.bufferPoolSize = bufferPoolSize; } public void setEventCache(int eventCache) { this.eventCache = eventCache; } public void setKeyCache(int keyCache) { this.keyCache = keyCache; } public void setAppReadBufSize(int appReadBufSize) { this.appReadBufSize = appReadBufSize; } public void setAppWriteBufSize(int appWriteBufSize) { this.appWriteBufSize = appWriteBufSize; } public void setProcessorCache(int processorCache) { this.processorCache = processorCache; } public void setTimeoutInterval(long timeoutInterval) { this.timeoutInterval = timeoutInterval; } public void setDirectBufferPool(int directBufferPool) { this.bufferPool = directBufferPool; } public int getUnlockTimeout() { return unlockTimeout; } public void setUnlockTimeout(int unlockTimeout) { this.unlockTimeout = unlockTimeout; } }