Skip to content

Instantly share code, notes, and snippets.

@xhanin
Created March 10, 2025 16:05
Show Gist options
  • Save xhanin/a3039cff84d1b76808e4baab4cbf9984 to your computer and use it in GitHub Desktop.
Save xhanin/a3039cff84d1b76808e4baab4cbf9984 to your computer and use it in GitHub Desktop.

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);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment