java activemq连接池_ActiveMQ学习:连接池的简单实现和模板模式的应用

本文介绍了如何在Java中实现ActiveMQ的连接池以及使用模板模式进行消息操作。通过创建连接池接口和实现,以及定义JMS模板,实现了连接的获取与释放,以及消息的发送和接收。示例代码展示了生产者和消费者的用法。
摘要由CSDN通过智能技术生成

一、安装activemq

下载地址:https://archive.apache.org/dist/activemq/5.13.0/apache-activemq-5.13.0-bin.zip

下载完后如果是64位操作系统打开~\apache-activemq-5.13.0\bin\win64目录下的activemq.bat即可,如果是32位的打开~\apache-activemq-5.13.0\bin\win32目录下的activemq.bat就可以了。

打开activemq的管理地址http://localhost:8161/admin/,用户名和密码都是admin,出现以下界面说明activemq已经正常运行。

46629296306b5700ec01c9b1fe733446.png

二、创建maven项目,pom.xml中添加activemq的jar包依赖:

org.apache.activemq

activemq-all

5.13.0

三、activemq连接池的实现

1、创建连接池接口ConnectionPool

packagecom.guods.mymq.activemq;importjavax.jms.Connection;importjavax.jms.JMSException;/*** jms连接池接口

*@authorguods

**/

public interfaceConnectionPool {

Connection getConnection()throwsJMSException;voidreleaseConnection(Connection connection);

}

2、连接池实现ConnectionPoolImpl

创建初始连接,并把连接存到链表,使用的时候从链表中获取连接。

packagecom.guods.mymq.activemq;importjava.util.LinkedList;importjavax.jms.Connection;importjavax.jms.ConnectionFactory;importjavax.jms.JMSException;importorg.apache.activemq.ActiveMQConnectionFactory;/*** jms连接池实现

*@authorguods

**/

public class ConnectionPoolImpl implementsConnectionPool {//连接用户名

private static final String USERNAME = "admin";//连接密码

private static final String PASSWORD = "admin";//连接地址

private static final String BROKEURL = "tcp://localhost:61616";//初始连接数

private static final int INIT_SIZE = 2;//最大连接数

private static final int MAX_SIZE = 5;//当前存在的连接总数,包括:正在使用的连接 + connections列表中的连接

private int poolSize = 0;//创建连接工厂

private ConnectionFactory connectionFactory = newActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);//存放空闲connection的链表

private LinkedList connections = new LinkedList();publicConnectionPoolImpl() {

initConnections();

}/*** 初始化连接,生成初始连接数*/

private voidinitConnections() {for (int i = 0; i < INIT_SIZE; i++) {try{

connections.add(createConnection());

}catch(JMSException e) {

e.printStackTrace();

}

}

}/*** 添加连接,每增加一个connection,poolSize加1

*@throwsJMSException*/

private synchronized Connection createConnection() throwsJMSException {

Connection newConnection=connectionFactory.createConnection();

newConnection.start();

poolSize++;returnnewConnection;

}/*** 删除连接,每删除一个connection,poolSize减1

*@paramconnection

*@throwsJMSException*/

private synchronized void delConnection() throwsJMSException {

Connection connection=connections.removeFirst();if (connection != null) {

connection.close();

poolSize--;

}

}/*** 从连接池获取connection

*@throwsJMSException*/

public synchronized Connection getConnection() throwsJMSException {int i = 0;while (true) {//3次获取连接失败,抛超时异常

if (i == 3) {throw new JMSException("Get connection timeout !");

}//连接池有连接,直接取一个返回

if (connections.size() > 0) {returnconnections.removeFirst();

}//连接池空,如果连接数没到最大,创建一个连接返回

if (poolSize

}catch(JMSException e) {

}

}//连接池空,并且连接达到最大数,等1秒再试尝试获取连接

try{

Thread.sleep(1000);

i++;

}catch(InterruptedException e) {

}

}

}/*** 释放连接,连接用完后放回队列*/

public synchronized voidreleaseConnection(Connection connection) {

connections.add(connection);

}

}

四、创建jms模板

beginSession方法从连接池获取连接,创建session。

endSession方法提交session,并把连接交还给连接池。

execute方法整合了beginSession和endSession两个模板方法,中间执行抽象方法action中的内容。

action在子类中实现业务操作,如创建队列、生产消息、消费消息等。

packagecom.guods.mymq.activemq;importjavax.jms.Connection;importjavax.jms.JMSException;importjavax.jms.Session;/*** 模板模式,创建JMS模板

*@authorguods

**/

public abstract classJmsTemplate {privateConnectionPool connectionPool;privateConnection connection;privateSession session;publicJmsTemplate(ConnectionPool connectionPool) {super();this.connectionPool =connectionPool;

}public abstract Object action(Session session) throwsJMSException;public Object execute() throwsJMSException{//获取连接,开启session

beginSession();//处理事务

Object object =action(session);//关闭session,释放连接

endSession();returnobject;

}/*** 从连接池获取connection,创建session

*@throwsJMSException*/

private void beginSession() throwsJMSException{

connection=connectionPool.getConnection();

session= connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);

}/*** 提交事务,关闭session,释放connection

*@throwsJMSException*/

private void endSession() throwsJMSException{

session.commit();

session.close();

connectionPool.releaseConnection(connection);

}

}

五、实现activemq的各种业务操作

packagecom.guods.mymq.activemq;importjavax.jms.JMSException;importjavax.jms.MessageConsumer;importjavax.jms.MessageProducer;importjavax.jms.Queue;importjavax.jms.Session;importjavax.jms.TextMessage;/*** activemq的各种业务操作

*@authorguods

**/

public classJmsAction {privateConnectionPool connectionPool;publicJmsAction(ConnectionPool connectionPool) {super();this.connectionPool =connectionPool;

}/*** 创建消息队列

*@paramqueueName

*@return*@throwsJMSException*/

public Queue createQueue(final String queueName) throwsJMSException {return (Queue) newJmsTemplate(connectionPool) {

@OverridepublicObject action(Session session) {try{returnsession.createQueue(queueName);

}catch(JMSException e) {return null;

}

}

}.execute();

};/*** 发送p2p消息

*@paramqueue

*@parammessage

*@throwsJMSException*/

public void produceP2pMessage(final Queue queue, final String message) throwsJMSException{newJmsTemplate(connectionPool) {

@Overridepublic Object action(Session session) throwsJMSException {

MessageProducer messageProducer=session.createProducer(queue);

TextMessage textMessage=session.createTextMessage(message);

messageProducer.send(queue, textMessage);return null;

}

}.execute();

}/*** 消费一条p2p消息

*@paramqueue

*@return*@throwsJMSException*/

public String consumP2pMessage(final Queue queue) throwsJMSException{return (String) newJmsTemplate(connectionPool) {

@Overridepublic Object action(Session session) throwsJMSException {

MessageConsumer createConsumer=session.createConsumer(queue);

TextMessage textMessage= (TextMessage) createConsumer.receive(10000);if (textMessage == null) {return null;

}returntextMessage.getText();

}

}.execute();

}

}

六、测试

1、生产者生产消息

packagecom.guods.mymq.activemq;importjavax.jms.JMSException;importjavax.jms.Queue;public classJmsProducer {private static ConnectionPool connectionPool = newConnectionPoolImpl();private static JmsAction jmsAction = newJmsAction(connectionPool);public static void main(String[] args) throwsJMSException {//创建队列

Queue queue = jmsAction.createQueue("MyQueue");//生产消息

for (int i = 0; i < 5; i++) {

String message= "第" + i + "条消息!";

jmsAction.produceP2pMessage(queue, message);

System.out.println("生产消息:" +message);

}

}

}

2、消费者消费消息

packagecom.guods.mymq.activemq;importjavax.jms.JMSException;importjavax.jms.Queue;public classJmsConsumer {private static ConnectionPool connectionPool = newConnectionPoolImpl();private static JmsAction jmsAction = newJmsAction(connectionPool);public static void main(String[] args) throwsJMSException {//创建队列

Queue queue = jmsAction.createQueue("MyQueue");//消费消息

while (true) {

String message=jmsAction.consumP2pMessage(queue);if (message != null) {

System.out.println("消费消息:" +message);

}

}

}

}

git源码:https://github.com/dongsheng824/mymq.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值