Problema
Embarcadero 9 servidor basado está procesando consume tiempo (30-60 seg) y pesado cálculo (~ 20 hilos involucrados en el procesamiento en paralelo) peticiones.
Debido a la naturaleza interactiva, el cliente puede cancelar la solicitud HTTP después de unos segundos y enviar una nueva.
Es deseable para cancelar el cálculo de inmediato si la conexión se ha cerrado por el cliente.
intentos fallidos
En caso de conexión HTTP cerrado, intentará escribir en la corriente de salida de respuesta activaría
IOException
. Sin embargo, en el caso de esta aplicación, estado HTTP depende de resultado de cálculo entera por lo que no es posible volver a escribir nada toma en el medio de procesamiento. Por lo tanto, esta opción no es aplicable.Embarcadero tener práctico
HttpConnection.getCurrentConnection()
método que puede ser utilizado para obtener referencias a algunas clases internas relacionadas con la conexión HTTP incluyendo subyacenteSocketChannel
. Aunque no he encontrado una manera de comprobar la vivacidad de la conexión embargoSocketChannel
u otras clases de Jetty relacionados con la conexión.
La mejor opción es utilizar el javax.servlet.AsyncContext
y su javax.servlet.AsyncListener
.
Empieza con una llamada a java.servlet.HttpServletRequest.startAsync()
conseguir el AsyncContext
.
A continuación, añadir una costumbre AsyncListener
de su propia, no se olvide de establecer también un tiempo de espera en su AsyncContext
(como su existencia anula el mecanismo predeterminado de tiempo de espera de inactividad)
Usted obtendrá los eventos que significan algo útil para usted ...
- onComplete - el tratamiento ha finalizado
- onError - el tratamiento ha fallado (tales como una terminación inesperada conexión)
- onTimeout - el tiempo de espera AsyncContext ha disparado
Este es el mecanismo que la API Servlet ha previsto exactamente su situación: la computación o procesamiento de back-end pesada durante una solicitud activo que podría ser terminado antes de tiempo.