这段代码有什么缺陷吗?

lam*_*988 0 java concurrency servlets

我编写了一个servlet,但servlet还没有处于生产阶段.

我在servlet的Filter中添加了一个计数器,这样当并发请求数达到限制时,就不能再接受任何人了.我担心一些边缘情况,例如:假设系统已经达到49个并发请求(50个是最大值),并且在synchronized块中它使布尔变量"ok"为True,然后在下一个实例中,多个线程看到servlet是可用的,并急于进入并打破限制.

如果有任何缺陷,请帮助检查此代码:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here

        // pass the request along the filter chain
        conditionalInfoLog(logEnabled, "Incoming request...");
        conditionalInfoLog(logEnabled, "Number of concurrent request(s): " + count);
        boolean ok;
        synchronized (lock) {
            ok = count < limit;
            if(ok){
                count++;
            }
        }
        if (ok) {
            try{
                // let the request through and process as usual
                conditionalInfoLog(logEnabled, "Request accepted and processing, number of concurrent request(s): " + count);
                chain.doFilter(request, response);

            }catch(Exception ex){
                conditionalErrorLog(logEnabled, ex.getMessage());
                String xmlStr = genXmlErrMsg(ex.getMessage());
                response.setContentType("text/xml");
                response.getWriter().print(xmlStr);
            }finally{
                synchronized (lock) {
                    count--;
                }
                conditionalInfoLog(logEnabled, "End of request. Number of concurrent request(s): " + count);
            }
        } else {
            // handle limit case, e.g. return status code 503
            conditionalInfoLog(logEnabled, busyMsg);
            String xmlStr = genXmlErrMsg(busyMsg);
            response.setContentType("text/xml");
            response.getWriter().print(xmlStr);
        }

    }
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

我宁愿在servletcontainer级别配置它而不是试图拼凑一些东西.一个不错的servletcontainer经过全面测试,确保生产就绪.

例如,Tomcat具有maxThreads完全用于此目的的属性.您可以在<Connector>元素中设置它server.xml.

<Connector maxThreads="50" ...>
Run Code Online (Sandbox Code Playgroud)

这限制了同时请求的数量(顺便说一下默认为200).因此,当有第51个请求时,它只是放入一个队列(其长度可以通过acceptCounts属性配置),直到第一个准备好.这也比503更加用户友好.

也可以看看:

  • serveradmin是负责它的人.顺便说一句,Websphere使用Tomcat的分支作为servletcontainer.所以很多配置设置应该看起来很熟悉. (2认同)