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

J2Explication détaillée de l'instance de l'écouteur sous haute charge ee

J2Explication détaillée de l'instance de l'écouteur sous haute charge ee

Introduction : Limiter the maximum concurrent number under high concurrency, set parameters (maximum concurrent number) in web.xml using a filter, and set other related parameters. Details can be found in the code.
First step: Configure the web.xml configuration, explain the parts that are not understood:50 is used through the parameter name maxConcurrent in the implementation class of the filter, filter-The class is the implementation class written,

url-The pattern is the URL that limits the concurrent time, end!

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

Second step: Write the implementation class to implement the filter, the interface has three methods, see the code for details.

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 implementation class ConcurrentCountFilter 
 */ 
public class ConcurrentCountFilter implements Filter { 
  private static Logger log = LoggerFactory.getLogger(ConcurrentCountFilter.class); 
  private FilterConfig filterConfig; 
  private int maxConcurrent = -1; 
  //Compte total 
  private static AtomicInteger count = new AtomicInteger(0); 
  /** 
   * Obtenir le nombre actuel de connexions concurrentes 
   * @return 
   */ 
  public static int get(){  
      return count.get();  
    }  
  /** 
   * Augmenter le nombre de connexions concurrentes 
   * @return 
   */ 
   public static int increase(){  
      return count.incrementAndGet();  
    } 
   /** 
   * Diminuer le nombre de connexions concurrentes 
   * @return 
   */ 
   public static int decrement(){ 
     return count.decrementAndGet(); 
   } 
  /** 
   * Initialisation 
   */ 
    public void init(FilterConfig filterConfig) throws ServletException { 
      //Obtenir le nombre maximum de connexions concurrentes configurées 
      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; 
      } 
    } 
    /** 
     * Méthode principale de filtrage 
     */ 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      try{ 
      //Augmenter le nombre de connexions concurrentes 
      int num = increase(); 
      if(maxConcurrent > 0){ 
        if(maxConcurrent >= num){ 
          chain.doFilter(request, response); 
          log.info("Nombre de connexions concurrentes pour la première fois : ");+count.get()); 
        } 
          HttpServletResponse res = (HttpServletResponse) response; 
          res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,"Limite de nombre maximum de concurrence atteinte"); 
          log.info("Nombre maximum de concurrence atteint"); 
          log.info("Quantité maximale de concurrence :"+count.get()); 
        } 
      } 
        chain.doFilter(request, response); 
        log.info("Deuxième quantité de concurrence :"+count.get()); 
      } 
      } 
        decrement(); 
        log.info("Réduction de la quantité de concurrence :"+count.get()); 
      } 
    } 
  /** 
   * Déconnexion et destruction 
   */ 
  public void destroy() { 
    this.filterConfig = null; 
    log.info("Destruction......"); 
  } 
} 

Le code est terminé ici.

Je vais me plaindre des problèmes que j'ai rencontrés dans le projet :

1.response.sendError( int, string);Dans le code de cet article, c'est res.sendError. Si, comme dans le code de cet article, il est retourné un503La page apportée par le serveur, cette page est rudimentaire et difficile à voir.

Pour informer l'utilisateur de manière amicale, il est nécessaire de suivre les étapes suivantes et de configurer le code suivant dans web.xml :

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

Si les informations ci-dessus sont configurées dans web.xml, elles seront filtrées en premier503dans l'état de code (HttpServletResponse.SC_SERVICE_UNAVAILABLE) de cette page sans générer une page du serveur.

Parmi503.jsp page doit être réalisée par soi-même. Ici, nous ne présentons qu'un exemple pour la référence, le code est comme suit :

<% 
response.setStatus(503); 
// Obtenir la classe d'exception 
Throwable ex = Exceptions.getThrowable(request); 
if (ex != null){ 
  LoggerFactory.getLogger("500.jsp").error(ex.getMessage(), ex); 
} 
// Message d'erreur de compilation 
StringBuilder sb = new StringBuilder("Message d'erreur :\n"); 
if (ex != null) { 
  sb.append(Exceptions.getStackTraceAsString(ex)); 
} 
  sb.append("Erreur inconnue.\n\n"); 
} 
// Si c'est une requête asynchrone ou mobile, retournez directement l'information 
if (Servlets.isAjaxRequest(request)) { 
  out.print(sb); 
} 
// Afficher la page de message d'exception 
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 - Le service est temporairement indisponible</title> 
  <%@include file="/WEB-INF/views/include/head.jsp" %> 
</head> 
<body> 
  <div class="container-fluid"> 
    <div class="page-header"><h1>Le service est temporairement indisponible, veuillez réessayer plus tard.</h1></div> 
    <div class="errorMessage"> 
      Information d'erreur : <%=ex==null?"Erreur inconnue.":StringUtils.toHtml(ex.getMessage())%> <br/> <br/> 
      Le serveur est temporairement indisponible, veuillez réessayer plus tard. Merci !<br/> <br/> 
      <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="history.go(-1);" class="btn">Retour à la page précédente</a>  
      <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="$('.errorMessage').toggle();" class="btn">Voir les détails</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">Retour à la page précédente</a>  
      <a href="javascript:" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="$('.errorMessage').toggle();" class="btn">Cacher les détails</a> 
      <br/> <br/> 
    </div> 
    <script>try{top.$.jBox.closeTip();}catch(e){}</script>/script> 
  </div> 
</body> 
</html> 
<% 
} out = pageContext.pushBody(); 
%> 

Cette page est beaucoup plus amicale que la page renvoyée par le serveur.

Merci de votre lecture, j'espère que cela peut vous aider, merci de votre soutien à ce site !

Déclaration : Le contenu de cet article est extrait du réseau, propriété de l'auteur original, contribué et téléchargé par les utilisateurs d'Internet. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu présumé enfreindre les droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu présumé enfreindre les droits d'auteur.)

Vous pourriez aussi aimer