试图理解这个Servlet调用的数量

时间:2012-03-02 11:31:43

标签: java tomcat servlets

我正在使用SiegeApache benchmarking tool进行一些负载测试。我计算了ServletrunAlgo内方法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
        }
  }

我有两个问题:

首先,方法runAlgo()的调用频率高于processRequest,这似乎很奇怪,因为runAlgo仅在此处调用!

然后另一个问题涉及基准测试,如果我发送200个请求,我从来没有在日志中计数200,但工具说所有事务都成功(服务器响应返回码&lt; 400)

您对这个合作伙伴有什么解释吗?

我使用apache-tomcat-7.0.11jdk1.7.0_02

2 个答案:

答案 0 :(得分:3)

您必须使用volatile关键字,因为很多线程都会使用 count count2

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

答案 1 :(得分:1)

这可能是一个线程问题。多个线程将运行代码,而++增量操作不是原子的。