English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Подробное описание слушателей в J2ee в условиях высокой нагрузки
Введение: Ограничение максимального количества параллельных запросов в условиях высокой нагрузки, настройка параметров фильтра в web.xml (максимальное количество параллельных запросов) и других связанных параметров. Подробности см. в коде.
Шаг 1: Настройка файла web.xml, объяснение неясных мест: параметр 50 используется через параметр maxConcurrent в классе реализации фильтра, filter-class это написанный класс,
url-pattern это ограничение времени параллельных запросов url, завершено!
<filter> <filter-name>ConcurrentCountFilter</filter-name> <filter-class>com.procure.pass.ConcurrentCountFilter</filter-class> <init-param> <param-name>maxConcurrent</param-name> <param-value>50</param-value> </init-param> </filter> <filter-mapping> <filter-name>ConcurrentCountFilter</filter-name> <url-pattern>/a/pass/export</url-pattern> </filter-mapping>
第二步: Напишите реализующий класс фильтра, который реализует интерфейс с тремя методами, см. код.
import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Класс реализации фильтра Servlet ConcurrentCountFilter */ public class ConcurrentCountFilter implements Filter { private static Logger log = LoggerFactory.getLogger(ConcurrentCountFilter.class); private FilterConfig filterConfig; private int maxConcurrent = -1; // Общий счет private static AtomicInteger count = new AtomicInteger(0); /** * Получение текущего количества одновременных подключений * @return */ public static int get(){ return count.get(); } /** * Увеличение количества одновременных подключений * @return */ public static int increase(){ return count.incrementAndGet(); } /** * Уменьшение количества параллельных запросов * @return */ public static int decrement(){ return count.decrementAndGet(); } /** * Инициализация */ public void init(FilterConfig filterConfig) throws ServletException { // Получение максимального количества параллельных запросов из конфигурации String maxStr = filterConfig.getInitParameter("maxConcurrent"); int num = -1; if(maxStr != null && !"".equals(maxStr)){ num = Integer.parseInt(maxStr); } if(num >= 1){ this.maxConcurrent = num; } this.maxConcurrent = -1; } } /** * Основной метод фильтрации */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try{ // Увеличение количества параллельных запросов int num = increase(); if(maxConcurrent > 0){ if(maxConcurrent >= num){ chain.doFilter(request, response); log.info("Первый параллельный запрос: " + count.get()); } HttpServletResponse res = (HttpServletResponse) response; res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Достигнуто ограничение максимального количества параллельных запросов"); log.info("Достигнуто максимальное количество параллельных запросов"); log.info("Максимальное количество параллельных запросов: " + count.get()); } } chain.doFilter(request, response); log.info("Второй параллельный запрос: " + count.get()); } } decrement(); log.info("Уменьшение количества параллельных запросов: " + count.get()); } } /** * Выход из уничтожения */ public void destroy() { this.filterConfig = null; log.info("Уничтожение......"); } }
Код заканчивается здесь.
Пожаловаться на яму, в которую я попал в проекте:
1.response.sendError( int, string); В данном коде res.sendError возвращает страницу с кодом состояния 503, которая выглядит грубо и некрасиво.
Для友好地 информирования пользователей, необходимо выполнить следующие шаги. В web.xml выполнить следующую конфигурацию кода:
<error-page> <error-code>503</error-code> <location>/WEB-INF/views/error/503.jsp</location> </error-page>
Если в web.xml был настроен вышеуказанный параметр, то будет фильтроваться страница с кодом состояния 503 (HttpServletResponse.SC_SERVICE_UNAVAILABLE), и не будет выдаваться страница сервера.
Страница 503.jsp должна быть создана самостоятельно. В данном примере приведен только пример для ознакомления. Код如下:
<% response.setStatus(503); // Получение класса исключения Throwable ex = Exceptions.getThrowable(request); if (ex != null){ LoggerFactory.getLogger("500.jsp").error(ex.getMessage(), ex); } // Компилируем информацию об ошибке StringBuilder sb = new StringBuilder("Информация об ошибке:\n"); if (ex != null) { sb.append(Exceptions.getStackTraceAsString(ex)); } sb.append("Неизвестная ошибка.\n\n"); } // Если это асинхронный запрос или мобильное устройство, то напрямую верните информацию if (Servlets.isAjaxRequest(request)) { out.print(sb); } // Вывод страницы с информацией об ошибке else { %> <%@page import="org.slf4j.Logger,org.slf4j.LoggerFactory"%> <%@page import="com.xahl_oa.internal.common.web.Servlets"%> <%@page import="com.xahl_oa.internal.common.utils.Exceptions"%> <%@page import="com.xahl_oa.internal.common.utils.StringUtils"%> <%@page contentType="text/html;charset=UTF-8" isErrorPage="true"%> <%@include file="/WEB-INF/views/include/taglib.jsp"%> <!DOCTYPE html> <html> <head> <title>503 - Сервис временно недоступен</title> <%@include file="/WEB-INF/views/include/head.jsp" %> </head> <body> <div class="container-fluid"> <div class="page-header"><h1>Сервис временно недоступен, пожалуйста, подождите.</h1></div> <div class="errorMessage"> Информация об ошибке: <%=ex==null?"Неизвестная ошибка.":StringUtils.toHtml(ex.getMessage())%> <br/> <br/> Сервер временно недоступен, пожалуйста, подождите и попробуйте еще раз. Спасибо! <br/> <br/> <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="history.go(-1);" class="btn">Вернуться на предыдущую страницу</a> <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="$('.errorMessage').toggle();" class="btn">Просмотреть подробности</a> </div> <div class="errorMessage hide"> <%=StringUtils.toHtml(sb.toString())%> <br/> <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="history.go(-1);" class="btn">Вернуться на предыдущую страницу</a> <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="$('.errorMessage').toggle();" class="btn">Скрыть详细信息</a> <br/> <br/> </div> <script>try{top.$.jBox.closeTip();}catch(e){}</script> </div> </body> </html> <% } out = pageContext.pushBody(); %>
Эта страница значительно приятнее, чем страница, выброшенная сервером.
Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!
Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, содержимое предоставлено пользователями Интернета, сайт не имеет права собственности, не было произведено редактирование, не несет ответственности за соответствующие юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для сообщения о нарушении,并提供相关证据. Если подтвердится, сайт немедленно удаляет涉嫌侵权的内容。