ActiveMQ的基本使用
一、 ActiveMQ的概述:
ActiveMQ 是一款开源的,完全支持JSM1.1和JavaEE1.4中的JMS provider实现的消息中心(MOM)。
二、ActiveMQ特点:
- 完全支持 JMS1.1和javaEE1.4规范
- 可以通过JDBC持久化消息(默认KahaDB )、分布式事务JTA和XADateSource
- 支持多种协议:TCP、UDP、SSL、NIO
- 支持多种语言:C、C++、C#、java、Ruby、Python、PHP
- 容易和Spring集成
- 在设计上保证了高性能的集群
三、ActiveMQ的应用场景:
- 高并发业务,因为ActiveMQ的队列容器(数据可以有优先级)和轮询机制可以很好的处理高并发
- 耗时长的业务:ActiveMQ是一种异步的消息机制,
- 解耦业务:ActiveMQ 中发布/订阅(pub/sub)模式可以广播消息,解耦业务
四、ActiveMQ的下载和运行
- 从官网下载程序:http://activemq.apache.org/download.html
- 解压
![]()
- 运行
![]()
启动程序
五、ActiveMQ一些重要配置
在apache-activemq-5.15.3\conf 中有一个activemq.xml 文件(主要配置ActiveMQ的消息监听端口,如tcp://localhost:61616)

ActiveMQ的管理界面端口(管理界面端口):

访问地址http://localhost:8161/admin/
六、配置ActiveMQ的持久化数据库
- 在activemq.xml文件中添加mysql的配置
1 <bean id="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 2 3 <property name="url" value="jdbc:mysql:///activemq"/> 4 5 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 6 7 <property name="username" value="root"/> 8 9 <property name="password" value="admin"/> 10 11 </bean>
- 将默认使用过kahadb的配置注释掉

替换成<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
七、配置ActiveMQ的访问密码
1 //在ActiveMQ.xml中添加 2 <plugins> 3 <simpleAuthenticationPlugin> 4 <users> 5 <authenticationUser username="admin" password="admin" groups="users,admins"/> 6 </users> 7 </simpleAuthenticationPlugin> 8 </plugins>

八、 ActiveMQ事务
ActiveMQ支持事务

一旦开启事务则第二个参数Session.AUTO_ACKNOWLEDGE将无效,原因是当transacted为true,则不会使用Session.AUTO_ACKNOWLEDGE 而是使用Session.SESSION_TRANSACTED
九、ActiveMQ签收方式
ActiveMQ 的签收机制:
- Session.AUTO_ACKNOWLEDGE:当客户端使用receive接收后,session会自动签收客户端这条消息,并且在数据库中将这条消息删除
- Session.CLIENT_ACKNOWLEDGE:需要msg.acknowledge()方法的配合,只有消息调用了acknowledge()方法则消息才会被签收,才会从数据库中删除
- Session.DUPS_OK_ACKNOWLEDG:允许在收到多个消息之后再一次性完成确认,这样能节约session,但是会出现消息重复的情况。

十、ActiveMQ的Demo项目搭建
使用Maven搭建Demo项目因为使用的ActiveMQ版本是5.15.3因此版本号要和使用的程序版本一致
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>5.15.3</version> </dependency> //不同的版本可以到https://mvnrepository.com/artifact/org.apache.activemq/activemq-broker 查找
十一、生产者代码
1 /** 2 * 生产者 3 */ 4 public class Product { 5 public static void main(String[] args) throws Exception { 6 //1.创建连接工厂 7 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( 8 "admin", 9 "admin", 10 "tcp://localhost:61616"); 11 //2.创建链接 12 Connection connection = connectionFactory.createConnection(); 13 connection.start(); 14 //3.创建会话 15 Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE); 16 //4.定义消息的目的地 17 Queue dest = session.createQueue("dest"); 18 //5.创建生产者 19 MessageProducer producer = session.createProducer(dest); 20 TextMessage msg; 21 for (int i = 0; i < 10; i++) { 22 msg = session.createTextMessage("消息" + i); 23 //发送消息 24 producer.send(dest,msg); 25 //TimeUnit.SECONDS.sleep(1); 26 } 27 //关闭资源 28 if(connection!=null){ 29 session.close(); 30 connection.close(); 31 } 32 } 33 }
十二、消费者代码
1 /** 2 * 消费者 3 */ 4 public class Customer { 5 public static void main(String[] args) throws Exception { 6 //1.创建连接工厂 7 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( 8 "admin", 9 "admin", 10 "tcp://127.0.0.1:61616"); 11 //2.创建链接 12 Connection connection = connectionFactory.createConnection(); 13 connection.start(); 14 //3.创建会话 15 Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE); 16 //4.定义消息的来源 17 Queue dest = session.createQueue("dest"); 18 //5.创建消费者 19 MessageConsumer consumer = session.createConsumer(dest); 20 while (true) { 21 22 //6.接收消息,receive有阻塞的功能 23 TextMessage msg = (TextMessage) consumer.receive(); 24 25 msg.acknowledge(); 26 System.out.println(msg.getText()); 27 } 28 } 29 }



启动程序
浙公网安备 33010602011771号