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)
我宁愿在servletcontainer级别配置它而不是试图拼凑一些东西.一个不错的servletcontainer经过全面测试,确保生产就绪.
例如,Tomcat具有maxThreads
完全用于此目的的属性.您可以在<Connector>
元素中设置它server.xml
.
<Connector maxThreads="50" ...>
Run Code Online (Sandbox Code Playgroud)
这限制了同时请求的数量(顺便说一下默认为200).因此,当有第51个请求时,它只是放入一个队列(其长度可以通过acceptCounts
属性配置),直到第一个准备好.这也比503更加用户友好.
归档时间: |
|
查看次数: |
220 次 |
最近记录: |