J 2 ee高同時の場合のListenerインスタンスの詳細

5637 ワード

J 2 ee高同時の場合のListenerインスタンスの詳細
引用:高合併で最大同時回数を制限し、web.xmlではフィルタでパラメータ(最大同時数)を設定し、その他の関連パラメータを設定します.詳細はコードを参照してください.第一歩:webを構成する.xmlの配置、分からないところは説明します:パラメータ50はパラメータ名maxConcurrentを通じてfilterの実現クラスの中で取得して、filter-classは書く実現クラスで、
url-patternは同時時間を制限するurlで、終わります!

 
  ConcurrentCountFilter 
  com.procure.pass.ConcurrentCountFilter 
   
    maxConcurrent 
    50 
   
  
  
  ConcurrentCountFilter 
  /a/pass/export 
  

第2歩:クラス実装filterを写実し、このインタフェースには3つの方法があり、詳細はコードを参照してください.

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; 
  //  
  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; 
      }else{ 
        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()); 
        }else{ 
          HttpServletResponse res = (HttpServletResponse) response; 
          res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE," "); 
          log.info(" "); 
          log.info(" :"+count.get()); 
        } 
      }else{ 
        chain.doFilter(request, response); 
        log.info(" :"+count.get()); 
      } 
      }finally { 
        decrement(); 
        log.info(" :"+count.get()); 
      } 
     
    } 
  /** 
   *   
   */ 
  public void destroy() { 
    this.filterConfig = null; 
    log.info(" ......"); 
  } 
} 

コードはこれで終わります.
自分がプロジェクトで出会った穴にツッコミを入れます.
1.response.sendError( int, string);本明細書のコードではres.sendErrorであり、本明細書のコードのように503サーバから持ち出されたページが直接返される場合、このページは乱暴で見苦しい.
ここでユーザに友好的に通知するためには、以下の手順をweb.xmlでは、次の構成コードを行います.

 
  503 
  /WEB-INF/views/error/503.jsp 
  

Webではxmlには、上記の情報が構成されており、サーバのページを捨てることなく、まず503(HttpServeretResponse.SC_SERVICE_UNAVAILABLE)ステータスコードの下のこのページがフィルタリングされる.
そのうち503.jspページは自分で完成する必要があります.ここでは1つの例を参考にしてください.コードは以下の通りです.

 
 
 
 
 
 
 
 
 
 
  503 -   
   
 
 
  
try{top.$.jBox.closeTip();}catch(e){}

このページは、サーバが投げ出すページよりもずっと友好的です.
読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!