ActiveMQ session 線程池實現

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
 
import javax.jms.JMSException;
import javax.jms.Session;
 
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQSession;
 
import com.hikvision.hare.bigdata2.comm.BigDataConstant;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
/**
 * MQ session連接池
 * @author Li Bangsen 2012-12-19 下午02:34:06
 */
public class ActiveMQPool {
private int currentNum = 0; // 該對象池當前已創建的對象數目
private Session currentObj;// 該對象池當前可以借出的對象
private List<Session> pool;// 用於存放對象的池
private ActiveMQConnection conn = null;
private Logger logger = LoggerFactory.getLogger(ActiveMQPool.class);
public ActiveMQPool() {
pool = Collections.synchronizedList(new LinkedList<Session>());
try {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BigDataConstant.CONFIG.MQ_URL);
connectionFactory.setOptimizeAcknowledge(true);
conn = (ActiveMQConnection)connectionFactory.createConnection();
conn.start();
} catch (JMSException e) {
logger.error("MQ session連接池異常", e);
}
}
public synchronized Session getSession() throws Exception {
if (pool.size() == 0 && currentNum < BigDataConstant.CONFIG.MQ_SESSION_MAXSIZE) {
// 如果當前池中無對象可用,而且已創建的對象數目小於所限制的最大值,創建一個新的對象
currentObj = conn.createSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
pool.add(currentObj);
currentNum++;
} else
if (pool.size() == 0 && currentNum >= 100) {
// 如果當前池中無對象可用,而且所創建的對象數目已達到所限制的最大值, 就只能等待其它線程返回對象到池中
while (pool.size() == 0) {
}
currentObj = (Session)pool.remove(0);
} else {
// 如果當前池中有可用的對象,就直接從池中取出對象
currentObj = (Session)pool.remove(0);
}
return currentObj;
}
/**
* 放回連接池
* @author Li Bangsen 2013-1-6 下午05:40:35
* @param session
*/
public void returnSession(Session session) {
pool.add(session);
}
/**
* 獲取連接
* @author Li Bangsen 2013-1-16 上午09:37:36
* @return
*/
public ActiveMQConnection getConn() {
return conn;
}
/**
* 關閉連接
* @author Li Bangsen 2013-1-9 上午10:17:26
* @throws Exception
*/
public void colseConn() throws Exception {
if (null != conn)
conn.close();
}
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章