Pregunta

En mi válvula obtengo el tiempo de ejecución de mi consulta http así:

public void invoke(Request request, Response response) 
throws IOException, ServletException {
long t1 = System.currentTimeMillis();
getNext().invoke(request, response);
long t2 = System.currentTimeMillis();
long time = t2 - t1;
...
}

Sospecho que el tiempo que obtengo de esta manera, no solo me da el tiempo de ejecución del lado del servidor, sino también el tiempo de la red.¿Es posible?

(Porque dependiendo del cliente que hace la solicitud el tiempo medio medido no es el mismo de una ip tengo un tiempo medio de 70ms y otra ip de 270ms)

He escrito exactamente el mismo código en un filtro:

long before = System.currentTimeMillis();
chain.doFilter(request, response);
long after = System.currentTimeMillis();

, pero en mi prueba el tiempo de ejecución en la válvula y en el filtro es el mismo ...

Estoy más interesado en obtener solo el tiempo de ejecución de mi servlet. Pero si pudiera obtener también la hora a la que se envía el último byte, me interesaría.

Muchas gracias por aclararme lo que se puede saber con válvulas y filtros.

¿Fue útil?

Solución

Sospecho que el tiempo que obtengo de esta manera, no solo me da el tiempo de ejecución del lado del servidor sino también el tiempo de la red. ¿Es posible?

Eso es correcto. Al menos, una parte del tiempo de red que implica la transferencia del cuerpo de la solicitud se incluye en el tiempo total de esta manera. El código de válvula / filtro / servlet se invoca directamente una vez que los encabezados de la solicitud se han leído y analizado por completo. El cuerpo de la solicitud no se lee necesariamente en su totalidad en ese momento. El cuerpo de la solicitud contiene todo lo que el cliente envía a través de la red como parte de la solicitud (por ejemplo, datos del formulario enviado). Solo cuando el filtro / servlet comienza a leer y analizar el cuerpo completo de la solicitud, p. Ej. getParameter(), getReader(), getInputStream(), etc., entonces todos los bytes del cuerpo de la solicitud se transferirán.

Es posible que desee volver a escribir la medición del tiempo de ejecución de tal manera que solo comience después de que el cuerpo de la solicitud se haya leído por completo. Esto significa que realmente tienes que medirlo justo dentro del servlet.

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Read the request body.
    String foo = request.getParameter("foo");
    String bar = request.getParameter("bar");
    // ...

    // Now, start the stopwatch.
    long startTime = System.nanoTime();

    // Now, do the business job.
    someService.process(foo, bar, ...);
    // ...

    // Now, stop the stopwatch.
    long elapsedTime = System.nanoTime() - startTime;

    // I don't think that you want to include JSP rendering in total time, right?
    request.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
}

(tenga en cuenta que utilicé System#nanoTime() ya que tiene una precisión mucho mejor )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top