Procesador de análisis de solicitudes de Tomcat y reutilización de solicitudes
Interpretación de Tomcat (5) --- Análisis del conector Este artículo explica el comportamiento del conector en BIO y NIO
En este artículo, comenzaremos desde la perspectiva de BIO y HTTP1.1. para leer el código fuente.
Necesita saber que el hilo Aceptador del Conector recibe una nueva conexión (socket) y crea un SocketProcessor para manejar solicitudes posteriores. Si no lo sabe, lea este artículo:
Este artículo explica cómo SocketProcessor maneja las solicitudes posteriores después de recibir una nueva conexión y la reutilización de "Procesador" y "Solicitud". El diagrama es el siguiente:
Después de obtener una nueva conexión, el SocketProcessor se utilizará para procesar una solicitud.
Recordemos un concepto:
Veamos SocketProcessor.run:
El trabajo realizado se resume en lo siguiente:
(sincronizado se usa para sockets sincronizados, después de todo, el socket se entregará entre el SocketProcessor antiguo y el nuevo)
Luego tenemos que analizar handler.run.p> Luego tenemos que analizar el comportamiento de handler.process .
Su método de proceso hereda de AbstractProtocol, analicémoslo:
Para facilitar la explicación, primero presentaré los usos de varias variables/funciones:
recicladoProcessors es una cola concurrente que contiene elementos para procesar la siguiente solicitud. Obtenga el procesador a través decycleProcessors.poll(); (si no hay procesador, créelo llamando a createProcessor()), llame a Processor.process para procesar la siguiente solicitud y finalmente llame a Release(wrapper, procesador, falso, verdadero); para eliminarlo de Eliminar de la cola.
Profundizaré en el punto sobre la liberación (contenedor, procesador, falso, verdadero) restableciendo variables. Echemos un vistazo a Http11Protocol.Http11ConnectionHandler.release:
Agregué comentarios que explican qué hacen estas dos líneas de llamadas a funciones. El tipo de procesador es Http11Processor, pero el reciclaje se implementa en la clase principal AbstractHttp11Processor:
La función es aproximadamente la siguiente:
Es decir, al llamar a recycle(), configúrelo en - 1 o falso, reciclaje(), lo establece en -1 o falso, liberando, liberando.falso, restablece un montón de variables a su estado original, pero no libera memoria en la matriz asociada. Si aún no estás seguro del comportamiento de recycle() , puedes rastrearlo tú mismo para no tener que dedicar demasiado tiempo aquí.
Usemos getInputBuffer().recycle(); y miremos el código fuente de AbstractInputBuffer.recycle:
Esto implica el reinicio de la solicitud. Indica que la solicitud ha sido recogida y reciclada.
El artículo establece claramente lo siguiente: