一、 ActiveMQ 消息队列的使用
MQ
MQ:Message Queue 消息队列,就是用来在系统之间进行消息传递的
这个队列有一系列具体的实现技术:ActiveMQ、rabbitMQ、kafka、RocketMQ(alibaba)
HttpCilent和MQ的比较
1 HttpClient只能算是两个系统间调用的技术
HttpClient支持跨操作系统跨语言调用
2 MQ可以在两个系统间进行信息交互,并且支持高并发
ActiveMQ支持跨操作系统的java语言中通信
rabbitMQ支持跨操作系统跨编程语言间的通信
1、ActiveMQ简介
什么是ActiveMQ
ActiveMQ工作原理:在本系统中的调用
1、 解决服务之间代码耦合
2、 使用消息队列,增加系统并发处理量
ActiveMQ应用场景分析:
1、 当系统使用短信平台、邮件平台的时候。
用户注册,重点使用用户信息数据库保存,而发短信、发邮件,增加业务处理复杂度,这时候使用MQ, 将发短信、发邮箱,通知MQ,由另外服务平台完成。解决了代码的耦合问题。
2、 当系统使用搜索平台、缓存平台的时候。
查询数据,建立缓存、索引 ,当再次查询相同数据的时候,不从数据库查询,从缓存或者索引库查询
当增加、修改、删除数据时,发送消息给MQ, 缓存平台、索引平台 从MQ获取到这个信息,更新缓存或者索引
总结:使用MQ作为系统间数据调用的中转站。
2、ActiveMQ安装和使用
官网:http://activemq.apache.org/
下载
下载windows版本
进行apache-activemq-5.14.0\bin\win64目录 启动activemq.bat 文件
访问:http://localhost:8161/ 点击:Manage ActiveMQ broker
用户名和密码 都是admin
ActiveMQ使用的是标准生产者和消费者模型
有两种数据结构 Queue、Topic (详见4.2)
1、Queue 队列(P2P消息模型) ,生产者生产了一个消息,只能由一个消费者进行消费 :给微信好友发消息
2、Topic 主题/广播(Pub/Sub消息模型),生产者生产了一个消息,可以由多个消费者进行消费
微信公众号给粉丝发消息
JMS和ActiveMQ的对应
JMS消息模型 | P2P模式 | pub/sub模式 |
---|---|---|
ActiveMQ消息 | Queue队列 | Topic队列 |
特点 | 一对一,一个人发送,只允许一个人接收 | 一对多,一个人发送,允许多个人接收 |
发送的人:生产者
接收的人:消费者
2、使用Java程序操作ActiveMQ
2.1、Queue-HelloWorld
2.1.1、pom
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.14.0</version>
</dependency>
</dependencies>
2.1.2、编写生产者
使用JMS原生API编写测试类,向消息中间件写入消息的开发步骤:
1 创建链接工厂
2 从链接工厂中获取链接
3 启动链接
4 获取会话
5 创建Queue队列
6 创建生产者
7 创建消息
8 发送消息
9 提交请求
10 关闭各种资源
第一步:在test/java包中,创建包activeMQ_helloworld,创建类ActiveMQProducter
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("hello1115");
//5 创建生产者
MessageProducer producer = session.createProducer(queue);
//6 创建消息
Message message = session.createTextMessage("hi i am boy");
//7 发送消息
producer.send(message);
//8 关闭消息
session.commit();
producer.close();
session.