开篇
项目中使用到activemq中间件,过程中使用,一直需求开发,并未有个深入的了解,特此学习了下ActiveMQ,ActiveMQ虽然是比较老牌的消息中间件,但是可学习的资料少有全面的,以下是个人在学习过程中整理的内容:
- MOM-消息中间件
- JMS规范
- ActiveMQ入门介绍
- Spring整合ActiveMQ
- ActiveMQ持久化及集群
- 项目中使用ActiveMQ
- 问题跟踪:Connect Reset
MOM-消息中间件
Message-oriented Middleware 面向消息的中间件
特点
异步
解耦
可靠、广播……MOM就是解决面对规模和复杂度越来越高的分布式系统的局限性,
同步通信,消息等待,客户端和服务对象生命周期紧耦合,点对点通信等。基于MOM系统
MOM的规范协议
JMS规范Java Messaging Service
AMQP协议Advanced Message Queuing Protocol
STOMP协议 Streaming Text Orientated Message Protocol
MQTT协议Message Queuing Telemetry Transport
……MOM的规范协议没有标准
当前流行的MOM
Apache ActiveMQ:JMS/AMOP/STOMP均支持
Apache RabbitMQ: AMQP标准
Apache RocketMQ/Aliware MQ
Kafka/Jafka:自行设计的基于TCP层的协议
Apache Artemis:ActiveMQ子项目,非阻塞架构可嵌入消息服务
Apache Apollo:ActiveMQ的下一代消息引擎
IronMQ:商业化的消息引擎
OpenMQ:JMS标准
MicroSoft MQ:微软的消息服务
ZeroMQ/JeroMQ:史上最快的消息队列
Distributedlog:Twitter高性能的分布式日志复制服务RabbitMQ,Erlang语言开发,通过插件形式支持其他标准协议,如STOMP等;Kafka基于Scala语言,JafKa是Kafka的Java移植版;Artemis原身为HornetQ;Apollo线程和消息分派架构不同于ActiveMQ,为ActiveMQ的支持高核心、高资源配置的扩展重构;OpenMQ是SUN公司推出,完全支持其制定的JMS规范;Zero不支持持久化,C++API库,严格上来讲ZeroMQ并不是消息中间件
JMS规范
Java Message Service,SUN公司推出,为了解决百家争鸣实现各种形式MOM的现象指定一套规范, java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。
消息模型
P2P-点对点Pub/Sub,发布订阅
体系架构
JMS提供者
JMS客户端
JMS生产者
JMS消费者
JMS消息
JMS队列
JMS主题JMS1.1 vs JMS2.0
优化用JMSContext取代了Connection和Session对象
利用try-with-resources块意味着无需调用close语句(JMSContext实现java.lang.AutoCloseable接口)
简化接收消息内容message.getBody(class)或者receiveBody(class)
创建会话简化传参,非事务只传递Session ACK,事务无需传递任何参数
JMSProducer/JMSConsumer轻量级且至此方法链新功能
同一个Topic可以指定Consumer共享
Producer可以延迟指定时间发送消息
Producer可以异步发送消息
Producer必须设置JMSXDeliveryCount消息属性
ActiveMQ入门介绍
官网:http://activemq.apache.org/
ActiveMQ的学习最好的是从官网上学习,但是ActiveMQ的官网让人吐槽的是杂乱无章,没有条理性,入门者学习比较痛苦。
特性
支持多种跨语言客户端:Java、C、C ++、C#、Ruby、Perl、Python、PHP
支持多种应用协议: OpenWire、Stomp 、AMQP、MQTT
完全支持JMS1.1和J2EE 1.4
支持多种传输协议:in-VM、TCP、SSL、NIO、UDP、Groups、JXTA
Ajax、CXF、Axis和Spring的支持
专为高性能集群,客户端服务器,对等通信而设计使用
下载包目录、配置、启停broker