in sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java [269:349]
protected void onCompleted(AsynchronousSocketChannel result, SocketAddress address) {
// Verify that the address has not been unbound
if (!channels.containsKey(address)) {
if (log.isDebugEnabled()) {
log.debug("onCompleted({}) unbound address", address);
}
return;
}
Nio2Session session = null;
Long sessionId = null;
boolean keepAccepting;
IoServiceEventListener listener = getIoServiceEventListener();
try {
if (listener != null) {
SocketAddress localAddress = result.getLocalAddress();
SocketAddress remoteAddress = result.getRemoteAddress();
listener.connectionAccepted(Nio2Acceptor.this, localAddress, remoteAddress, address);
}
// Create a session
IoHandler handler = getIoHandler();
setSocketOptions(result);
session = Objects.requireNonNull(
createSession(Nio2Acceptor.this, address, result, handler),
"No NIO2 session created");
sessionId = session.getId();
handler.sessionCreated(session);
sessions.put(sessionId, session);
if (session.isClosing()) {
try {
handler.sessionClosed(session);
} finally {
unmapSession(sessionId);
}
} else {
session.startReading();
}
keepAccepting = true;
} catch (Throwable exc) {
if (listener != null) {
try {
SocketAddress localAddress = result.getLocalAddress();
SocketAddress remoteAddress = result.getRemoteAddress();
listener.abortAcceptedConnection(Nio2Acceptor.this, localAddress, remoteAddress, address, exc);
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug("onCompleted(" + address + ") listener=" + listener + " ignoring abort event exception",
e);
}
}
}
keepAccepting = okToReaccept(exc, address);
// fail fast the accepted connection
if (session != null) {
try {
session.close();
} catch (Throwable t) {
log.warn("onCompleted(" + address + ") Failed (" + t.getClass().getSimpleName() + ")"
+ " to close accepted connection from " + address
+ ": " + t.getMessage(),
t);
}
}
unmapSession(sessionId);
}
if (keepAccepting) {
try {
// Accept new connections
socket.accept(address, this);
} catch (Throwable exc) {
failed(exc, address);
}
} else {
log.error("=====> onCompleted({}) no longer accepting incoming connections <====", address);
}
}