English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تفسير سماعات الاستماع في حالة الارتفاع في J2ee

تفسير سماعات الاستماع في حالة الارتفاع في J2ee

مقدمة: تقييد عدد الاشتراكات القصوى في ظل الازدحام العالي، في web.xml باستخدام ملف التصفية لضبط المعاملات (عدد الاشتراكات القصوى) وتعيين المعاملات الأخرى ذات الصلة. يرجى الرجوع إلى الكود.
الخطوة الأولى: تكوين 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> 

الخطوة الثانية: كتابة كلاس التنفيذ لـ filter، يحتوي على ثلاثة طرق، راجع الكود.

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 Filter هو 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 (الرجاء استبدال #بـ @ عند إرسال البريد الإلكتروني) لإبلاغنا، وقدم الدليل على الدليل، وإذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فوراً.

أنت قد تستمتع بهذا