1. 程式人生 > >使用Filter限制J2EE最大併發數

使用Filter限制J2EE最大併發數

在開發J2EE的過程往往需要限制併發請求量從而減少伺服器異常的可能性。而這些通常都是通過叢集手段或外部代理來實現的。本文主要介紹單個應用如何不依賴其他程式來解決這個問題。

J2EE的每個請求都是經由過濾器(責任鏈模式),Servlet來執行的,每個請求的進入都需要過濾器的准許才能執行到Servlet,那麼只需要在過濾器上計算當前的併發數並與最大允許數量對比即可實現併發限制。

原始碼:

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;

/**
 * 併發量計數與限制過濾器
 * @author ZYB
 * @date Dec 2, 2014 3:21:36 PM<BR/>
 */
public class ConcurrentCountFilter implements Filter{
	// 如果不是用來限制全域性併發(配置路徑為/*的)的那麼把static關鍵字去掉即可.
	private static AtomicInteger count = new AtomicInteger(0);
	
	/**
	 * 獲取當前併發數
	 * @author ZYB
	 * @date Dec 3, 2014 9:51:37 AM<BR/>
	 * @return
	 */
	public static int get(){
		return count.get();
	}
	
	/**
	 * 增加併發數量
	 * @author ZYB
	 * @date Dec 3, 2014 9:51:32 AM<BR/>
	 * @return
	 */
	public static int increase(){
		return count.incrementAndGet();
	}
	
	/**
	 * 減少併發數量
	 * @author ZYB
	 * @date Dec 3, 2014 9:51:22 AM<BR/>
	 * @return
	 */
	public static int decrement(){
		return count.decrementAndGet();
	}
	
	/**
	 * 最大併發允許數量, 負數表示不限制
	 */
	private int maxConcurrent = -1;
	
	/* (non-Javadoc)
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		String maxStr = filterConfig.getInitParameter("maxConcurrent");
		int num = -1;
		if(maxStr != null && !"".equals(maxStr)){
			try{
				num = Integer.parseInt(maxStr);
			}catch(NumberFormatException e){}
		}
		if(num >= 1){
			this.maxConcurrent = num;
		}else{
			this.maxConcurrent = -1;
		}
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		try{
			int num = increase();//增加併發數量,並取得當前數量
			if(maxConcurrent > 0){//檢查是否限制最大併發數量, <=0表示不限制
				if(maxConcurrent >= num){//檢查是否超過最大併發限制, 沒超過則允許執行
					chain.doFilter(request, response);
				}else{
					//超過最大併發限制
					HttpServletResponse res = (HttpServletResponse) response;
					res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "達到最大併發數限制:" + this.maxConcurrent);
				}
			}else{//未限制最大併發數
				chain.doFilter(request, response);
			}
		}finally{//由於Servlet執行時可能會丟擲異常,所以使用try-finally塊來減少併發數非常必要.
			decrement();
		}
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#destroy()
	 */
	@Override
	public void destroy() {
	}

}


相關推薦

使用Filter限制J2EE併發

在開發J2EE的過程往往需要限制併發請求量從而減少伺服器異常的可能性。而這些通常都是通過叢集手段或外部代理來實現的。本文主要介紹單個應用如何不依賴其他程式來解決這個問題。 J2EE的每個請求都是經由過濾器(責任鏈模式),Servlet來執行的,每個請求的進入都需要過濾器的准

瀏覽器同域名請求的併發限制

當我們在瀏覽網頁的時候,對瀏覽速度有一個重要的影響因素,就是瀏覽器的併發數量。併發數量簡單通俗的講就是,當瀏覽器網頁的時候同時工作的進行數量。   如果同時只有2個併發連線數數量,那網頁開啟的時候只能依賴於

mysql 檢視連線,狀態,併發

show status like '%max_connections%'; ##mysql最大連線數set global max_connections=1000 ##重新設定show variables like '%max_connections%'; ##查詢資料庫當前設定的最大連線數 show gl

(CSDN遷移) JAVA多執行緒實現-可控併發執行緒池(newFixedThreadPool)

上篇文章中介紹了單執行緒化執行緒池newSingleThreadExecutor,可控最大併發數執行緒池(newFixedThreadPool)與其最大的區別是可以通知執行多個執行緒,可以簡單的將newSingleThreadExecutor理解為newFixedThreadPool(1)。例如執行一下兩個程

Mysql 檢視連線,狀態 併發

-- show variables like '%max_connections%'; 檢視最大連線數 set global max_connections=1000 重新設定 mysql> show status like 'Threads%'; +---

Mysql 檢視連線,狀態 併發 && 怎麼設定才合理

show status like '%max_connections%'; ##mysql最大連線數 set global max_connections=1000 ##重新設定 show variables like '%max_connections%'; ##查詢資料庫當前設定的最大連線數 show

Mysql 檢視連線,狀態 併發(贊)

1.show status    Threads_connected  當前的連線數    Connections  試圖連線到(不管是否成功)MySQL伺服器的連線數。    Max_used_connections  伺服器啟動後已經同時使用的連線的最大數量。 2.set GLOBAL max_con

2018年最後一天 VsCode中執行nodeJs程式碼的簡單方法 Pgsql和Mysql的對比 Tomcat的併發 Spring AOP不起作用原因

發現2017的隨筆總結依舊適用,想堅持每天寫點東西分享,但感覺每天能原創分享的內容真的不多,尤其是要把自己想分享的內容寫清楚也需要額外花費很多的時間,這讓本來平時就工作比較忙的自己疲於應付,於是乎就轉載自己看到的一些好的文章分享,甚至有些文章自己都沒完全看完就發,湊合著完成了任務,但自己的成就感很低。因此我不

Tomcat的效能與併發

當一個程序有 500 個執行緒在跑的話,那效能已經是很低很低了。Tomcat 預設配置的最大請求數是 150,也就是說同時支援 150 個併發,當然了,也可以將其改大。當某個應用擁有 250 個以上併發的時候,應考慮應用伺服器的叢集。具體能承載多少併發,需要看硬體的配置,C

iOS GCD中如何控制併發

//聯絡人:石虎  QQ: 1224614774暱稱:嗡嘛呢叭咪哄 一、概述 1、GCD併發的困擾 在GCD中有兩種佇列,分別是序列佇列和併發佇列。在序列佇列中,同一時間只有一個任務在執行,不能充分利用多核 CPU 的資源,效率較低。 併發佇列可以分配多

oracle 併發 會話查詢

SQL> select count(*) from v$session #當前的連線數 SQL> Select count(*) from v$session where status='ACTIVE' #併發連線數 SQL> select value

Apache 設定併發

prefork的工作原理是, 控制程序在最初建立“StartServers”個子程序後,為了滿足MinSpareServers設定的需要建立一個程序,等待一秒鐘,繼續建立兩 個,再等待一秒鐘,繼續建立四個……如此按指數級增加建立的程序數,最多達到每秒32個,直到滿足MinSpareServers設定的值為止

設定springboot自帶tomcat的連線併發

從原始碼來看,最大連線數和最大併發數預設是10000和200 可以通過工程下的application.yml配置檔案來改變這個值 server:   tomcat:     uri-enco

Oracle併發&License情況

檢視當前license情況 SQL> show parameter license; NAME TYPE VALUE ----------------------------------

Linux下高併發socket連線各種限制的調優

1、修改使用者程序可開啟檔案數限制  在Linux平臺上,無論編寫客戶端程式還是服務端程式,在進行高併發TCP連線處理時,最高的併發數量都要受到系統對使用者單一程序同時可開啟檔案數量的限制(這是因為系統為每個TCP連線都要建立一個socket控制代碼,每個socket控制代碼同時也是一個檔案控制代碼)。可使用

Linux下高併發socket連線所受的各種限制

1、修改使用者程序可開啟檔案數限制在Linux平臺上,無論編寫客戶端程式還是服務端程式,在進行高併發TCP連線處理時,最高的併發數量都要受到系統對使用者單一程序同時可開啟檔案數量的限制(這是因為系統為每個TCP連線都要建立一個socket控制代碼,每個socket控制代碼同時也是一個檔案控制代碼)。可使用ul

Nginx限制訪問速率和併發連線模組--limit (防止DDOS攻擊)

Nginx限制訪問速率和最大併發連線數模組–limit (防止DDOS攻擊) Tengine版本採用http_limit_req_module進行限制 和官方nginx類似,不過支援多個變數,並且支援多個limit_req_zone的設定。比如:

JS在頁面限制checkbox復選

clas alert fonts 還要 val inpu choice 技術 tracking 應該是挺簡單的代碼, 記錄一下分享. 首先最直接的想法就是使用循環, 用局部變量記錄已選的checkbox, 達到最大值就將余下的checkbox都禁止選擇, 例如以下:

IIS 之 連線併發連線併發工作執行緒、佇列長度、工作程序數

轉載: 參考:https://blog.csdn.net/enweitech/article/details/79815137 https://blog.csdn.net/enweitech/article/details/79815137 https://blog.csdn.net/b

IIS併發連線

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!