- ActiveMQ简介:https://my.oschina.net/u/4284277/blog/3212385
- SpringBoot整合ActiveMQ:https://my.oschina.net/u/4284277/blog/3212387
- MQ理论知识:https://my.oschina.net/u/4284277/blog/3212391
1.安装
官网:http://activemq.apache.org/
百度网盘地址:
链接:https://pan.baidu.com/s/1A55X-vchhsaxaoaIXDUw8g
提取码:qby6
复制这段内容后打开百度网盘手机App,操作更方便哦
1.1 下载
进入官网,向下滑动到这个位置
点击下载最新windows版
1.2 运行
1.2.1 解压并启动
将下载好的压缩文件,根据自己的需求放到指定目录,然后解压,
解压后到apache-activemq-5.15.12\bin\win64目录 启动activemq.bat 文件
1.2.2 登录
访问:http://localhost:8161
点击 Manage ActiveMQ broker,点击去下面标识的即可看到
账号和密码都是admin
http://localhost:8161/admin/
登录成功,看到如下页面
1.3 小小介绍一下,后面详细介绍
ActiveMQ使用的是标准生产者和消费者模型
1. Queue队列(P2P消息模型),生产者生产了一个消息,只能由一个消费者进行消费。如给微信好友发消息。
2. Topic主题/广播(Pub/Sub消息模型),生产者生产了一个消息,可以由多个消费者进行消费。如微信公众号给粉丝发消息。
JMS和ActiveMQ的对应
JMS消息模型 | P2P模式 | pub/sub模式 |
---|---|---|
ActiveMQ消息 | Queue队列 | Topic队列 |
特点 | 一对一,一个人发送,只允许一个人接收 | 一对多,一个人发送, 允许多个人接收 |
发送的人: 生产者
接收的人: 消费者
2.使用Java操作ActiveMQ
2.1 创建普通maven项目
简单的截几张创建时的图
2.1.1 添加pom依赖
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.0</version>
</dependency>
</dependencies>
如果自己仓库没有依赖, 导入后会自己下载, 稍等即可
2.1.2 编写生产者
使用JMS原生API编写测试类, 小消息中间件写入消息的开发步骤如下:
1. 创建连接工厂
2. 从连接工厂中获取连接
3. 启动连接
4. 获取会话
5. 创建Queue队列
6. 创建生产者
7. 创建消息
8. 发送消息
9. 提交请求
10. 关闭各种资源
2.1.2.1 创建包com.manlu.queue , 创建类ActiveMQProducter
package com.manlu.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @author 漫路h
* 生成者发送消息
*/
public class ActiveMQProducter {
public static void main(String[] args) throws Exception {
// 连接工厂
// 使用默认用户名、密码、路径
// 因为: 底层实现: final String defaultURL = "tcp://"+DEFAULT_BROKER_HOST+ ":" + DEFAULT_BROKER_PORT;
// 所以: 路径 tcp://host:61616
// 1. 创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
// 2. 创建连接
Connection connection = connectionFactory.createConnection();
// 3. 打开连接
connection.start();
// 4. 创建会话
//第一个参数: 是否开启事务
//第二个参数: 消息是否自动确认
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建队列
Queue queue = session.createQueue("hello");
// 5. 创建生产者
MessageProducer producer = session.createProducer(queue);
// 6. 创建消息
TextMessage message = session.createTextMessage("hi i am manlu");
// 7. 发送消息
producer.send(message);
// 8. 关闭资源
session.commit();
producer.close();
session.close();
connection.close();
System.out.println("消息生成成功");
}
}
2.1.2.2 查看控制台,消息发送成功
2.1.2.3 查看消息是否发送成功(访问安装时登录的网址)
默认tcp连接activeMQ端口 61616 !!
2.1.3 编写消费者
使用JMS原生API编写测试类,向消息中间件消费消息的开发步骤:
1. 创建链接工厂
2. 创建链接
3. 启动链接
4. 获取会话
5. 创建队列
6. 创建消费者
7. 消费消息
8. 提交
9. 关闭资源
2.1.3.1 创建类ActiveMQConsumer,使用MessageConsumer完成消费
package com.manlu.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @author manlu
* 使用MessageConsumer完成消费
*/
public class ActiveMQConsumer {
public static void main(String[] args) throws Exception {
// 1.创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
// 2.创建连接
Connection connection = connectionFactory.createConnection();
// 3.开启连接
connection.start();
// 4.创建会话
/*
* 第一个参数,是否使用事务
* 如果设置true,操作消息队列后, 必须使用 session.commit();
* 如果设置false, 操作消息队列后, 不使用 session.commit();
*/
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 5.创建队列
Queue queue = session.createQueue("hello");
// 6.创建消费者
MessageConsumer consumer = session.createConsumer(queue);
while (true){
//失效时间, 如果10秒内没有收到新的消息,说明没有消息存在,此时可以退出当前循环
TextMessage message = (TextMessage) consumer.receive(10000);
if (message!=null) {
System.out.println(message.getText());
}else{
break;
}
}
// 7.关闭连接
session.commit();
session.close();
connection.close();
System.out.println("消费结束");
}
}
2.1.3.2 查看控制台,可以发现消息已经被消费
2.1.3.3 查看页面效果(访问安装时登录的网址)
- 消费前
- 消费后
2.1.4 监听器消费消息
package com.manlu.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @author 漫路
* 监听器消费消息
* 重复测试生成和消费的过程。实现一边生成,一边消费的系统
*/
public class ActiveMQMonitorConsumer {
public static void main(String[] args) throws Exception {
// 1.创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
// 2.创建连接
Connection connection = connectionFactory.createConnection();
// 3.开启连接
connection.start();
// 4.创建会话
/*
* 第一个参数,是否使用事务
* 如果设置true,操作消息队列后, 必须使用 session.commit();
* 如果设置false, 操作消息队列后, 不使用 session.commit();
*/
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 5.创建队列
Queue queue = session.createQueue("hello");
// 6.创建消费者
MessageConsumer messageConsumer = session.createConsumer(queue);
messageConsumer.setMessageListener(new MessageListener() {
//每次接受消息,自动调用 onMessage
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//我们不让程序结束,因为如果结束, 监听就结束了
while (true){
//目的: 不让程序死掉
}
}
}
2.2 多消费模式-queue
P2P消息模型中的多消费者模式,得出结论如下:
- 一个消息只能被一个消费者消费, 不可重复消费
- 多个消费者均分消息(负载均衡策略)
- 当消费者在消费某个消息的时候, mq一定要等到它的成功回执, 才会分发下一个消息
注意: 测试的时候一定要先启动消费者,再启动生产者
2.3 Topic
Topic:主题模式、广播模式、pus/sub模式
// 1. 创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
// 2. 创建连接
Connection connection = connectionFactory.createConnection();
// 3. 打开连接
connection.start();
// 4. 创建会话
//第一个参数: 是否开启事务
//第二个参数: 消息是否自动确认
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 5.创建Topic主题模式
Topic topic = session.createTopic("manlu123");
// 6.创建生产者
MessageProducer producer = session.createProducer(topic);
2.4 多消费模式-topic
2.4.1 queue和topic模式的比较
相同点:
1. 都只有一个生产者
2. 都可以有多个消费者
不同点:
1. queue队列模式, 一个消息只能别一个消费者消费, 不能重复消费
当消费者消费某个消息的时候,一定要得到这个消息被成功消费的回执,才会分发下一个消息
queue入队之后,无论等待多久, 消息都会一直等待消费者来处理
2. topic广播模式, 一个消息可以被多个消费者消费
这个消息无论被成功消费与否,都无所谓
topic要求时间要一致, 我正好发, 你正好收