2012-03-02 5 views
2

Je fais un test de charge en utilisant Siege et Apache benchmarking tool. Je compte le nombre d'appels pour le Servlet et pour la méthode runAlgo à l'intérieur processRequest. -je utiliser ce code:Essayer de comprendre ce nombre d'appels Servlet

import java.io.IOException; 
    import java.io.PrintWriter; 
    import java.util.ArrayList; 
    import javax.servlet.ServletException; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    @WebServlet(name = "Servlet", urlPatterns = {"/test"}) 
    public class Servlet extends HttpServlet { 

     static int count=0; 
     static int count2=0; 
     /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      System.out.println("Process request : "+count2++); 
      response.setContentType("text/html;charset=UTF-8"); 
      PrintWriter out = response.getWriter(); 
      try { 
       // TODO output your page here 
       out.println("<html>"); 
       out.println("<head>"); 
       out.println("<title>Result</title>"); 
       out.println("</head>"); 
       out.println("<body>"); 
       out.println("<h1>Result : " + runAlgo() + "</h1>"); 
       out.println("</body>"); 
       out.println("</html>"); 

      } finally {    
       out.close(); 
      } 
     } 

     private ArrayList<String> runAlgo() { 
      System.out.println("algo : "+count++); 
      //the algo code 
     } 
    } 

J'ai 2 problèmes:

En premier lieu, la méthode runAlgo() est appelée plus souvent que processRequest, il semble étrange parce que runAlgo n'est appelé ici! Puis l'autre problème concerne le benchmark, si j'envoie par exemple 200 requêtes je n'ai jamais dans le log un compte de 200, mais les outils disaient que toutes les transactions avaient été réussies (le serveur a répondu avec un code retour < 400)

Avez-vous des explications pour ce comportement?

J'utilise apache-tomcat-7.0.11 et jdk1.7.0_02

+0

c'est probablement la façon dont vous calculez occurrences journal –

+0

Je n'ai pas de réponse pour vous , mais j'aime le mot "comportement". – skaffman

+0

@Qwe, ok des conseils? Et j'ai trouvé le comportement dans le dictionnaire peut-être que le "comportement" est meilleur? Désolé pour mon anglais: s –

Répondre

3

Vous devez utiliser volatile mot-clé parce que nombre et count2 sont utilisés par un grand nombre de fils

static volatile int count=0; 
static volatile int count2=0; 
+2

+1 .... ou utiliser 'AtomicInteger' au lieu de' volatile int' – skaffman

+1

'volatile int' améliorer le résultat (presque parfait pour runAlgo) mais il est encore imprécis. 'AtomicInteger' fonctionne parfaitement merci beaucoup! –

1

Ceci est probablement un problème de filetage. Plusieurs threads exécuteront le code et l'opération ++ increment n'est pas atomique.