資源簡介
RabbitMQ客戶連接池的Java實現。我們剛開始也是采用這種方式來實現的,但做壓力測試時,發現這種每次新建Connection和新建Channel是非常耗時的,在大并發下,一般都要8毫秒左右,慢的話,好多都是幾十毫秒。因此我們創建了Java的RabbitMQ的連接池對象。
代碼片段和文件信息
package?com.eduwest.pool;
import?java.io.IOException;??
import?java.io.InputStream;??
import?java.net.URL;
import?java.util.Properties;??
import?java.util.Vector;
import?com.rabbitmq.client.Connection;
import?com.rabbitmq.client.ConnectionFactory;
public?class?ConnectionWrapper
{
private?static?ConnectionWrapper?factory?=?null;???
private?static?final?int?INIT_SIZE?=?20;?//連接池初始化大小??
private?static?final?int?MAX_SIZE?=?1000;?//連接池的最大值??
private?String?driver;??
private?String?url;??
private?String?username;??
private?String?password;??
private?long?activeTime?=?5000;??
private?Vector?connectPool?=?null;//存放數據庫連接的向量??
public?ConnectionWrapper()?{??
??//初始化連接的配置??
??this.initProperties();??
??//初始化數據庫的連接池??
??this.initPool();??
}??
private?void?initProperties()?{??
??Properties?dbPro?=?new?Properties();??
??InputStream?input?=?this.getClass().getResourceAsStream(“mqconnection.properties“);?
??try?{??
??????dbPro.load(input);?
??????this.url?=?dbPro.getProperty(“url“);??
??????this.username?=?dbPro.getProperty(“username“);??
??????this.password?=?dbPro.getProperty(“password“);?
?????
??}?catch?(Exception?e)?{??
??????e.printStackTrace();??
??}??
}??
private?void?initPool()?{??
??if(null?==?connectPool)?{??
??????//創建數據庫連接池??
??????connectPool?=?new?Vector(INIT_SIZE);??
??????//循環創建數據庫連接??
??????for?(int?i?=?0;?i???????????MQConnection?db?=?new?MQConnection(url?username?password);??
??????????System.out.println(“創建了MQConnection連接“);??
??????????connectPool.add(db);??
??????}??
??}??
}??
public?static?synchronized?ConnectionWrapper?getConnectionWrapper()?{??
??if(null?==?factory)?{??
??????factory?=?new?ConnectionWrapper();??
??}??
??return?factory;??
}??
public?MQConnection?createNewConectionTimer()?{??
??//此方法的作用是:當獲取連接的時候,如果連接不夠了,才會執行這個方法創建連接??
??synchronized?(connectPool)?{??
??????MQConnection?db?=?new?MQConnectionTimer(driver?url?username?password?activeTime);??
??????System.out.println(“創建了MQConnectionTimer連接“);??
??????connectPool.add(db);??
??????return?db;??
??}??
}??
public?Connection?getConnection()?{??
??System.out.println(“此時連接池中還有的連接數:?“?+?connectPool.size());??
??synchronized?(connectPool)?{??
??????Connection?conn?=?null;??
??????MQConnection?db?=?null;??
??????while(true)?{??
??????????//循環查找空閑的連接,直到找到位置??
??????????for?(int?i?=?0;?i???????????????db?=?connectPool.get(i);??
??????????????if(!db.isUsed())?{??
??????????????????System.out.println(“有空閑的連接“);??
??????????????????//此連接處于空閑狀態??
??????????????????if(db?instanceof?MQConnectionTimer)?{??
??????????????????????//System.out.println(“取得的鏈接是MQConnectionTimer“);??
??????????????????????//如果db是MQConnectionTimer對象??
??????????????????????MQConnectionTimer?dbTimer?=?(MQConnectionTimer)db;??
??????????????????????dbTimer.cacel();?//取消定時??
??????????????????????conn?=db.getConn();?
??
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5424??2017-11-22?17:44??ConnectionWrapper.java
?????文件???????1952??2017-11-21?11:03??MQConnection.java
?????文件?????????54??2017-11-22?15:40??mqconnection.properties
?????文件????????935??2017-11-21?11:02??MQConnectionTimer.java
?????文件????????856??2017-11-21?10:50??MQConTimerTask.java
?????文件???????2727??2017-11-22?17:52??RabbitMQServer.java
-----------?---------??----------?-----??----
????????????????11948????????????????????6
- 上一篇:Android實現斷點上傳大文件
- 下一篇:ROM簽名工具auto-sign.rar
評論
共有 條評論