1.1. MQ
1. MQ(message queue):消息队列;个人理解:本质上是一个队列,存放message,然后还能按照规则去取;主要的目的是为了系统解耦。
2. JMS(Java Message Service):是一个java面向mq中间件的规范;
3. ACTIVEMQ:实现了JMS1.1规范的面向消息的中间件; 还有其它中间件RabbitMQ、Kafka、ZeroMQ等等,有些实现了JMS规范,有些则没有;
MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。
l 为什么使用MQ
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
l ActiveMQ解决了如下的问题
① 信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失?
② 如何降低发送者和接收者的耦合度?
③ 如何让优先级高的接收者先接到数据?
④ 如何做到有效均衡接收者的负载?
⑤ 如何有效的将数据发送到相关的接收者?也就是说将接收者订阅不同的数据,如何做有效的过滤。
⑥ 如何做到可扩展,甚至将这个通信模块发到集群上?
⑦ 如何保证接收者接收到了完整,正确的数据?
1.1. JMS
JMS即Java消息服务(Java Message Service),是一个Java平台中关于面向消息中间件(MOM)的规范,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
JMS是一个与具体平台无关的API,具有跨平台性。
它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。
JMS定义了五种不同的消息正文格式:
• StreamMessage : 数据流消息
• MapMessage: Map键值对消息
• TextMessage: 文本消息
• ObjectMessage: 序列化Java对象消息
• BytesMessage: 字节消息
1.2. ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS(Java Message Service)1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
ActiveMQ消息的传递有两种类型:
一种是点对点的,即一个生产者和一个消费者一一对应;
一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
主要特点:
1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去
4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6. 支持通过JDBC和journal提供高速的消息持久化
7. 从设计上保证了高性能的集群,客户端-服务器,点对点
8. 支持Ajax
9. 支持与Axis的整合
10. 可以很容易得调用内嵌JMS provider,进行测试
点对点模式(Point To Point)
Producer:消息的生产者 ,就是发消息的
Queue:消息队列方式,存储消息到ActiveMQ消息中间件服务器
Consumer:消息的消费者,就是收消息和消费消息
1.1.1. Producer消息生产者
开发步骤:
1. 创建ConnectionFactory连接工厂
2. 通过连接工厂创建连接Connection
3. 通过连接的start方法开启连接
4. 通过连接对象创建Session会话对象
5. 通过session创建队列Queue,(可以设置queue(点对点)和topic(订阅))
6. 通过session创建MessageProducer消息的生产者
7. 创建消息对象TextMessage并设置消息文本
8. 通过MessageProducer消息生产者发送消息
9. 关闭Producer、session、connection
1.1.1. Consumer消息消费者
开发步骤
1. 创建ConnectionFactory连接工厂
2. 通过连接工厂创建连接Connection
3. 通过连接的start方法开启连接
4. 通过连接对象创建Session会话对象
5. 通过session创建队列Queue,(可以设置queue(点对点)和topic(订阅))
6. 通过session创建MessageConsumer消息消费者对象
7. 通过MessageConsumer消息消费者对象循环接收消息
8. 输出结果
9. 关闭session、连接
1.1. topic的使用
发布/订阅模式(Publish/Subscribe)
使用方法和queue是一样的,只是在使用Session对象创建Destination时选择topic就可以。
1.1. Queue与pub/sub区别
1、点对点PTP(queue队列):
a. 一个消息的生产者只能对应一个消息的消费者(一对一)
b. 消费者一定可以消费该消息(在线或不在线都可以),
只要有一个消费者消费了该消息就会从消息队列中删除.
2、发布/订阅pub/sub:
a. 一个消息的生产者能对应多个消息的消费者(一对多)
b. 只针对目前在线的所有消费者.(不在线的消费者不能消费该消息)
1. ActiveMQ消息事务
怎样保证消息能正确的消费?
假如消费消息的业务处理出现异常?
假如消费消息的服务器宕机?
解决思路:
1、接收消息方,采用消息事务。处理业务成功时提交消息事务,处理业务失败时回滚消息事务。
2、采用点对点消息模式,保证消息一定可以被消费者都消费,不然永远存储在消息队列中。
注意:
1、自定消息监听器需要实现SessionAwareMessageListener接口(有消息事务)。
2、用了消息事务时,当处理消息失败,默认重发6次,并把消息存放到
ActiveMQ.DLQ死信队列中。