Created
May 15, 2017 16:31
-
-
Save qsLI/5b8aa2b417fbccb0f5b4bab04459e9a3 to your computer and use it in GitHub Desktop.
tomcat nio Acceptor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// --------------------------------------------------- Acceptor Inner Class | |
/** | |
* The background thread that listens for incoming TCP/IP connections and | |
* hands them off to an appropriate processor. | |
*/ | |
protected class Acceptor extends AbstractEndpoint.Acceptor { | |
@Override | |
public void run() { | |
int errorDelay = 0; | |
// Loop until we receive a shutdown command | |
while (running) { | |
// Loop if endpoint is paused | |
while (paused && running) { | |
state = AcceptorState.PAUSED; | |
try { | |
Thread.sleep(50); | |
} catch (InterruptedException e) { | |
// Ignore | |
} | |
} | |
if (!running) { | |
break; | |
} | |
state = AcceptorState.RUNNING; | |
try { | |
//if we have reached max connections, wait | |
countUpOrAwaitConnection(); | |
SocketChannel socket = null; | |
try { | |
// Accept the next incoming connection from the server | |
// socket | |
//serverSock是在服务端监听之后返回的 | |
socket = serverSock.accept(); | |
} catch (IOException ioe) { | |
//we didn't get a socket | |
countDownConnection(); | |
// Introduce delay if necessary | |
errorDelay = handleExceptionWithDelay(errorDelay); | |
// re-throw | |
throw ioe; | |
} | |
// Successful accept, reset the error delay | |
errorDelay = 0; | |
// setSocketOptions() will add channel to the poller | |
// if successful | |
if (running && !paused) { | |
if (!setSocketOptions(socket)) { | |
countDownConnection(); | |
closeSocket(socket); | |
} | |
} else { | |
countDownConnection(); | |
closeSocket(socket); | |
} | |
} catch (SocketTimeoutException sx) { | |
// Ignore: Normal condition | |
} catch (IOException x) { | |
if (running) { | |
log.error(sm.getString("endpoint.accept.fail"), x); | |
} | |
} catch (OutOfMemoryError oom) { | |
try { | |
oomParachuteData = null; | |
releaseCaches(); | |
log.error("", oom); | |
}catch ( Throwable oomt ) { | |
try { | |
try { | |
System.err.println(oomParachuteMsg); | |
oomt.printStackTrace(); | |
}catch (Throwable letsHopeWeDontGetHere){ | |
ExceptionUtils.handleThrowable(letsHopeWeDontGetHere); | |
} | |
}catch (Throwable letsHopeWeDontGetHere){ | |
ExceptionUtils.handleThrowable(letsHopeWeDontGetHere); | |
} | |
} | |
} catch (Throwable t) { | |
ExceptionUtils.handleThrowable(t); | |
log.error(sm.getString("endpoint.accept.fail"), t); | |
} | |
} | |
state = AcceptorState.ENDED; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment