Question

Dans ma valve, j'obtiens le temps d'exécution de ma requête HTTP comme ça:

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;
...
}

Je soupçonne que le moment où j'obtiens ainsi, non seulement me donne le temps d'exécution du côté serveur mais aussi le temps du réseau? Est-il possible ?

(Parce que selon le client qui fait la demande, le temps moyen mesuré n'est pas le même d'une IP, j'ai 70 ms de temps moyen et une autre IP 270 ms)

J'ai écrit le même code exactement dans un filtre:

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

, mais dans mon test, le temps d'exécution dans la valve et dans le filtre sont les mêmes ...

Je suis plus intéressé à obtenir le temps d'exécution de mon servlet uniquement. Mais si je pouvais obtenir aussi le moment où le dernier octet est envoyé, je serais intéressé.

Merci beaucoup pour me clarifier ce qui est possible à savoir avec les vannes et les filtres.

Était-ce utile?

La solution

Je soupçonne que le moment où j'obtiens ainsi, non seulement me donne le temps d'exécution du côté serveur mais aussi le temps du réseau? Est-il possible ?

C'est correct. Au moins, un partiel du temps du réseau impliquant le transfert du corps de demande est inclus dans le temps total de cette façon. Le code de soupape / filtre / servlet est invoqué directement une fois la demande têtes ont été entièrement lus et analysés. La demande corps n'est pas nécessairement entièrement lu à ce moment-là. Le corps de demande contient tout ce que le client envoie sur le réseau dans le cadre de la demande (par exemple, les données de formulaire soumises). Uniquement lorsque le filtre / servlet commence à lire et à analyser le corps de la demande complète par exemple getParameter(), getReader(), getInputStream(), etc., alors tous les octets du corps de la demande seront réellement transférés.

Vous voudrez peut-être réécrire votre mesure du temps d'exécution de telle manière qu'il ne commence qu'après que le corps de la demande a été complètement lu. Cela signifie que vous devez vraiment le mesurer directement à l'intérieur du 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);
}

(Notez que j'ai utilisé System#nanoTime() Comme il a un bien mieux précision)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top