Я написал сервлет, но сервлет еще не в стадии производства.
Я добавил счетчик в Фильтр сервлета, чтобы, когда количество одновременных запросов достигло предела, не болеелюди могут быть приняты.Я беспокоюсь о некотором предельном случае, например: скажем, система уже достигла 49 одновременных запросов (50 макс.), И в синхронизированном блоке это делает булеву переменную «ok» равной True, а затем в следующем случае несколько потоков видят, чтосервлет доступен и ворвитесь в него и нарушите лимит.
Пожалуйста, помогите проверить этот код, если есть какой-либо недостаток:
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);
}
}