LifecycleBase.start() -> Connector.startInternal() -> Protocol.start() (eg Http11NioProtocol) -> Endpoint.bind() (eg NioEndpoint)
NioEndpoint bind -> initServerSocket
serverSock = ServerSocketChannel.open();
socketProperties.setProperties(serverSock.socket());
InetSocketAddress addr = new InetSocketAddress(getAddress(), getPortWithOffset());
serverSock.bind(addr, getAcceptCount());
Nio2Endpoint bind
serverSock = AsynchronousServerSocketChannel.open(threadGroup);
socketProperties.setProperties(serverSock);
InetSocketAddress addr = new InetSocketAddress(getAddress(), getPortWithOffset());
serverSock.bind(addr, getAcceptCount());
Nio2Acceptor - acceptor thread
Nio2Endpoint - setSocketOptions
- process socket connection
=> use endpoint executor to call SocketProcessor - doRun
endpoint create executor
public void createExecutor() {
internalExecutor = true;
if (getUseVirtualThreads()) {
executor = new VirtualThreadExecutor(getName() + "-virt-");
} else {
TaskQueue taskqueue = new TaskQueue(maxQueueSize);
TaskThreadFactory tf = new TaskThreadFactory(getName() + "-exec-", daemon, getThreadPriority());
executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), getThreadsMaxIdleTime(),
TimeUnit.MILLISECONDS, taskqueue, tf);
taskqueue.setParent((ThreadPoolExecutor) executor);
}
}
SocketProcessor doRun - process socket in same thread (worker) socket processor -> connection handler -> processor.process -> dispatch -> coyote adapter.async dispatch -> => catalina valve pipeline processing of request in worker thread
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);