正文
class
Poller
implements
Runnable
{
public
void
register
(
final
NioChannel socket)
{
socket.setPoller(
this
);
KeyAttachment key = keyCache.poll();
final
KeyAttachment ka = key!=
null
?key:
new
KeyAttachment(socket);
... ...
ka.setKeepAliveLeft(NioEndpoint.
this
.getMaxKeepAliveRequests());
... ...
PollerEvent r = eventCache.poll();
... ...
addEvent(r);
}
@Override
public
void
run
()
{
while
(
true
) {
... ...
Iterator
iterator =
keyCount >
0
? selector.selectedKeys().iterator() :
null
;
while
(iterator !=
null
&& iterator.hasNext()) {
SelectionKey sk = iterator.next();
KeyAttachment attachment = (KeyAttachment)sk.attachment();
if
(attachment ==
null
) {
iterator.remove();
}
else
{
attachment.access();
iterator.remove();
processKey(sk, attachment);
}
}
... ...
}
}
protected
boolean
processKey
(SelectionKey sk, KeyAttachment attachment)
{
... ...
if
(sk.isReadable()) {
if
(!processSocket(channel, SocketStatus.OPEN_READ,
true
)) {
closeSocket =
true
;
}
}
if
(!closeSocket && sk.isWritable()) {
if
(!processSocket(channel, SocketStatus.OPEN_WRITE,
true
)) {
closeSocket =
true
;
}
}
... ...
}
public
boolean
processSocket
(NioChannel socket, SocketStatus status,
boolean
dispatch)
{
... ...
KeyAttachment attachment = (KeyAttachment)socket.getAttachment();
... ...
SocketProcessor sc = processorCache.poll();
if
( sc ==
null
) sc =
new
SocketProcessor(socket,status);
else
sc.reset(socket,status);
if
( dispatch && getExecutor()!=
null
) getExecutor().execute(sc);
else
sc.run();
... ...
}
}
流程由 Socket poller thread 切换到了 Worker threads pool SocketProcessor,Worker threads pool 是用来处理业务逻辑的线程池,接下来分析 Tomcat 如何解析请求的。
解析请求
SocketProcessor 会流转到
org.apache.coyote.http11.AbstractHttp11Processor.process
中,解析请求相关逻辑如下:
public SocketState process(SocketWrapper socketWrapper) throws IOException {
... ...
keepAlive = true;
if (disableKeepAlive()) {
socketWrapper.setKeepAliveLeft(0);
}
... ...
prepareRequest();
... ...
if (maxKeepAliveRequests == 1) {
keepAlive = false;
} else if (maxKeepAliveRequests > 0 && socketWrapper.decrementKeepAlive() <= 0) {
keepAlive = false;
}
... ...