介绍
ActiveMQ
ActiveMQ 是Apache出的,最流行的,功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议,带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式和许多先进的功能。
什么是JMS?
Java消息服务(Java Message Service) 即JMS,是一个java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
什么是AMQP?
AMQP(advanced message queuing protocol) 是一个提供统一消息服务的应用层标准层协议,基于此协议的客户端与消息中间件可传递性,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
JMS 和 AMQP 对比
ActiveMQ、RabbitMQ 和 Kafka 简单对比
JMS规范
JMS相关概念
- 消费者/订阅者 : 接收并处理消息的客户端
- 消息 : 应用程序之间传递的数据内容
- 消息模式 : 在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式
JMS消息模式—队列模型
- 客户端包括生产者和消费者
- 队列中的消息只能被一个消费者消费
- 消费者可以随时消费队列中的消息
队列模型示意图
JMS消息模式—主题模型
- 客户端包括生产者和消费者
- 主题中的消息被所有消费者消费
- 消费者必须先订阅,才能消费发送到主题中的消息
主题模型示意图
JMS编码接口
- ConnectionFactory 用于创建连接到消息中间件的连接工厂
- Connection 代表了应用程序和消息服务器之间的通信链路
- Destination 指消息发布和接收的地点,包括队列或主题
- Session 表示一个单线程的上下文,用于发送和接收消息
- MessageConsumer 由会话创建,用于接收发送到目标的消息
- MessageProducer 由会话创建,用于发送消息到目标
- Message 是在消费者和生产者之间传送的对象,消息头,一组消息属性,一个消息体
JMS编码接口之间的关系
安装
- 查询Docker镜像
1 | $ docker search activemq |
- 下载Docker镜像
1 | $ docker pull webcenter/activemq |
- 创建&运行ActiveMQ容器
1 | $ docker run -d --name myactivemq -p 61616:61616 -p 8161:8161 webcenter/activemq |
- 查看WEB管理页面
浏览器输入http://127.0.0.1:8161/ 点击Manage ActiveMQ broker使用默认账号/密码:admin/admin进入查看
队列模式消息和主题模式消息代码演示
队列模式消息演示
生产者 AppProducer.java
1 | public class AppProducer { |
消费者 AppConsumer.java (由于消费者的创建流程和生产者非常类似,特意用 ActiveMqHelper 类进行简单封装一下)
1 | public class AppConsumer { |
MQ帮助类 ActiveMqHelper.java
1 | public class ActiveMqHelper { |
代码效果图展示
主题模式消息演示
生产者 AppProducer.java (主题模式的代码示例和队列模式的代码示例基本相同,只有在创建主题目标的时候不同,还请老铁自行实现) 消费者同理参考队列模式代码实现
1 | public class AppProducer { |
主题模式注意点:
1、先启动AppConsumer.java类(消费者先进行订阅),在启动 AppProvider.java 类(生产者进行生产)这样消费者才能监听到生产者生成的消息进行消费;队列模式没有此要求
2、生产者生产100条消息,若有多个消费者,每个消费者均消费100条消息;而队列模式,则是每个消费者合计起来消费这 100 条消息
代码效果图展示