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

J2Detaillierte Erklärung von Listener-Instanzen bei hoher Last

J2Detaillierte Erklärung von Listener-Instanzen bei hoher Last

Einführung: Unter Hochkonfliktsituationen die maximale Anzahl gleichzeitig aktiver Vorgänge begrenzen, indem im web.xml-Datei ein Filter verwendet wird, um Parameter (maximale Anzahl gleichzeitiger Vorgänge) zu setzen, und andere relevante Parameter zu konfigurieren. Nähere Informationen finden Sie im Code.
Schritt 1: Konfigurieren Sie web.xml-Konfiguration, Erklärung der unbekannten Stellen:50 wird durch den Parametername maxConcurrent in der Implementationsklasse des Filters verwendet, filter-class ist die geschriebene Implementationsklasse,

url-pattern ist die URL, die die Zeit der Konkurrenz begrenzt, das Ende!

<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> 

Schritt 2: Schreiben Sie die Implementationsklasse für den Filter, der diese three Methoden hat, siehe Code.

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 Implementationsklasse ConcurrentCountFilter 
 */ 
public class ConcurrentCountFilter implements Filter { 
  private static Logger log = LoggerFactory.getLogger(ConcurrentCountFilter.class); 
  private FilterConfig filterConfig; 
  private int maxConcurrent = -1; 
  //Gesamtzähler 
  private static AtomicInteger count = new AtomicInteger(0); 
  /** 
   * Erhalt der aktuellen Anzahl der gleichzeitigen Anfragen 
   * @return 
   */ 
  public static int get(){  
      return count.get();  
    }  
  /** 
   * Erhöhung der Anzahl der gleichzeitigen Anfragen 
   * @return 
   */ 
   public static int increase(){  
      return count.incrementAndGet();  
    } 
   /** 
   * Verringerung der Anzahl der gleichzeitigen Anfragen 
   * @return 
   */ 
   public static int decrement(){ 
     return count.decrementAndGet(); 
   } 
  /** 
   * Initialisierung 
   */ 
    public void init(FilterConfig filterConfig) throws ServletException { 
      //Erhalt der maximalen Anzahl der gleichzeitigen Anfragen aus der Konfiguration 
      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; 
      } 
    } 
    /** 
     * Filterhauptmethode 
     */ 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      try{ 
      //Erhöhung der Anzahl der gleichzeitigen Anfragen 
      int num = increase(); 
      if(maxConcurrent > 0){ 
        if(maxConcurrent >= num){ 
          chain.doFilter(request, response); 
          log.info("Erste Anzahl der gleichzeitigen Anfragen:")+count.get()); 
        } 
          HttpServletResponse res = (HttpServletResponse) response; 
          res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,"Erreicht die maximale Durchsatzzahlbeschränkung"); 
          log.info("Erreicht maximale Durchsatzzahl"); 
          log.info("Maximale Durchsatzmenge: "+count.get()); 
        } 
      } 
        chain.doFilter(request, response); 
        log.info("Zweite Durchsatzmenge: "+count.get()); 
      } 
      } 
        decrement(); 
        log.info("Verringerter Durchsatz: "+count.get()); 
      } 
    } 
  /** 
   * Abbruch der Zerstörung 
   */ 
  public void destroy() { 
    this.filterConfig = null; 
    log.info("Zerstören......"); 
  } 
} 

Der Code ist hiermit abgeschlossen.

Hier ist ein paar Kritik an den Fehlern, die ich im Projekt beobachtet habe:

1.response.sendError(int, string); Im Code dieses Artikels ist es res.sendError, wobei eine direkte Rückgabe wie im Code dieses Artikels erfolgt503Die von dem Server bereitgestellte Seite ist brutal und sehr unansehnlich

Um den Benutzern eine freundliche Benachrichtigung zu geben, sind folgende Schritte erforderlich, die Konfigurationscode in web.xml ist wie folgt:

<error-page> 
  <error-code>503</error-code> 
  <location>/WEB-INF/views/error/503.jsp</location> 
 </error-page> 

Wenn die obigen Informationen in web.xml konfiguriert sind, wird zuerst gefiltert503mit dem Statuscode (HttpServletResponse.SC_SERVICE_UNAVAILABLE) dieser Seite wird keine Serverseite geworfen.

Darunter503.jsp-Seite muss selbst erstellt werden, hier ist nur ein Beispiel angegeben, der Code ist wie folgt:

<% 
response.setStatus(503); 
// Exceptionenklasse erhalten 
Throwable ex = Exceptions.getThrowable(request); 
if (ex != null){ 
  LoggerFactory.getLogger("500.jsp").error(ex.getMessage(), ex); 
} 
// Kompilationsfehlermeldung 
StringBuilder sb = new StringBuilder("Fehlermeldung: \n"); 
if (ex != null) { 
  sb.append(Exceptions.getStackTraceAsString(ex)); 
} else { 
  sb.append("Unbekannter Fehler.\n\n"); 
} 
// Bei asynchronen Anfragen oder vom Mobilgerät aus wird die Nachricht direkt zurückgegeben]} 
if (Servlets.isAjaxRequest(request)) { 
  out.print(sb); 
} 
// Fehlerseiteninformation ausgeben 
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 - Der Service ist vorübergehend nicht verfügbar</title> 
  <%@include file="/WEB-INF/views/include/head.jsp" %> 
</head> 
<body> 
  <div class="container-fluid"> 
    <div class="page-header"><h1>Der Service ist vorübergehend nicht verfügbar, bitte versuchen Sie es später noch einmal.</h1></div> 
    <div class="errorMessage"> 
      Fehlermeldung:<%=ex==null?"Unbekannter Fehler.":StringUtils.toHtml(ex.getMessage())%> <br/> <br/> 
      Der Server ist vorübergehend nicht verfügbar, bitte versuchen Sie es später noch einmal. Vielen Dank! <br/> <br/> 
      <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="history.go(-1);" class="btn">Zurück zur vorherigen Seite</a>  
      <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="$('.errorMessage').toggle();" class="btn">Details anzeigen</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">Zurück zur vorherigen Seite</a>  
      <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="$('.errorMessage').toggle();" class="btn">Details verbergen</a> 
      <br/> <br/> 
    </div> 
    <script>try{top.$.jBox.closeTip();}catch(e){}</script>/script> 
  </div> 
</body> 
</html> 
<% 
} out = pageContext.pushBody(); 
%> 

Diese Seite ist viel freundlicher als die von Servern ausgespuckte Seite.

Vielen Dank für das Lesen, ich hoffe, es hilft Ihnen, danke für Ihre Unterstützung dieser Website!

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig und eigenständig hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @ beim Senden von E-Mails zur Meldung von Verstößen und fügen Sie relevante Beweise bei. Bei nachgewiesenen Verstößen wird diese Website den fraglichen urheberrechtlichen Inhalt sofort löschen.)

Gefällt mir