Embarcadero cómo detectar si la conexión HTTP se cierra por el cliente

Alexey Ragozin:

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

  1. 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.

  2. 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 subyacente SocketChannel. Aunque no he encontrado una manera de comprobar la vivacidad de la conexión embargo SocketChannelu otras clases de Jetty relacionados con la conexión.

Joakim Erdfelt:

La mejor opción es utilizar el javax.servlet.AsyncContexty su javax.servlet.AsyncListener.

Empieza con una llamada a java.servlet.HttpServletRequest.startAsync()conseguir el AsyncContext.

A continuación, añadir una costumbre AsyncListenerde 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.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=477150&siteId=1
Recomendado
Clasificación