Пытаясь понять это количество вызовов сервлетов - PullRequest
2 голосов
/ 02 марта 2012

Я делаю нагрузочный тест, используя Siege и Apache Benchmarking Tool . Я считаю количество вызовов для Servlet и для метода runAlgo внутри processRequest. Я использую этот код:

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

У меня 2 проблемы:

Во-первых, метод runAlgo() вызывается чаще, чем processRequest, это кажется странным, потому что runAlgo вызывается только здесь!

Тогда другая проблема касается эталонного теста: если я отправляю, например, 200 запросов, у меня никогда не бывает в журнале счетчика 200, но инструменты говорят, что все транзакции были успешными (сервер ответил кодом возврата <400) </p>

У вас есть некоторые объяснения для этого ассортимента?

Я использую apache-tomcat-7.0.11 и jdk1.7.0_02

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Вы должны использовать ключевое слово volatile , потому что count и count2 используются многими потоками

 static volatile int count=0;
 static volatile int count2=0;
1 голос
/ 02 марта 2012

Это, вероятно, проблема с многопоточностью. Несколько потоков будут выполнять код, и операция приращения ++ не является атомарной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...