学习activemq前,先了解了解jmsjava
1. 简介服务器
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息(发送消息的时候,接收者不须要在线),进行异步通讯。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。markdown
JMS消息由三部分组成:session
消息头app
JMS消息头预约义了若干字段用于客户端与JMS提供者之间识别和发送消息,预编译头以下:异步
– JMSDestination : 消息发送的目的地,主要是指Queue和Topic,由session建立而由生产者的send方法设置.
– JMSDeliveryMode:传送模式:有两种即久模式和非持久模式。一条持久性的消息应该被传输"一次仅仅一次",这就意味着若是JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复以后再次传递。一条非持久的消息最多会传递一次,这意味着服务器出现故障,该消息将永远丢失。由session穿件由消息生产者的send方法设置
– JMSMessageID:惟一识别每一个消息的标识,由JMS消息生产者产生。由send方法设置
– JMSTimestamp:一个JMS Provider在调用send()方法时自动设置,它是消息被发送和消费者实际接收的时间差。由客户端设置
– JMSCorrelationID:用来链接到另一个消息,典型的应用是在回复消息中链接到原消息。在大多数状况下,JMSCorrelationID用于将一条消息标记为对JMSMessageID标示的上一条消息的应答,不过,JMSCorrelationID能够是任何值,不单单是JMSMessageID。由客户端设置
– JMSReplyTo:提供本消息回复消息的目的地址,由客户端设置
– JMSRedelivered:若是一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并无签收(acknowledged)。若是该消息被从新传送,JMSRedelivered=true 不然 JMSRedelivered=flase 。由JMS Provider设置
– JMSType:消息类型的标识符,由客户端设置
– JMSExpiration:消息过时时间,等于Destination的send方法中的timeToLive值加上发送时刻的GMT的时间值。若是timeToLive值等于零,则JMSExpiration被设置为零,表示该消息永不过时。若是发送后,在消息过时时间以后消息尚未被发送到目的地,则该消息被清除。由send方法设置
– JMSPriority:消息优先级,从0-9十个级别,0-4是普通消息,5-9是加急消息。JMS不要求JMS Provider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达,默认是4级。由send方法设置
`
一个消息的消息头有这些属性,咱们能够按照须要对这个消息的消息进行设计,在将这个消息使用消息生产者的send()方法发送到消息服务上。
**消息属性**
咱们能够给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性很是有用,JMS API定义了一些标准属性,JMS服务提供者能够选择性的提供部分标准属性。
**消息体**
在消息体中,JMS API定义了五种类型的消息格式,让咱们能够以不一样的形式发送和接受消息,并提供了对已有消息格式的兼容。不一样的消息类型以下:
```js
Text message : javax.jms.TextMessage,表示一个文本对象。
Object message : javax.jms.ObjectMessage,表示一个JAVA对象。
Bytes message : javax.jms.BytesMessage,表示字节数据。
Stream message :javax.jms.StreamMessage,表示java原始值数据流。
Map message : javax.jms.MapMessage,表示键值对。
复制代码
2. JMS支持两种消息发送和接收模型。分布式
1. P2P(Point to Point)点对点模式ide
P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。学习
每一个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。ui
P2P的特色:
每一个消息只有一个消费者(Consumer)(即一旦被消费,消息就再也不在消息队列中)
发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息以后,无论接收者有没有正在运行,它不会影响到消息被发送到队列
接收者在成功接收消息以后需向队列应答成功
2.Publish/Subscribe(Pub/Sub) 发布订阅模式
Pub/Sub模式包含三个角色:主题(Topic),发布者(Publisher),订阅者(Subscriber)。
多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
Pub/Sub的特色:
每一个消息能够有多个消费者
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须建立一个订阅以后,才能消费发布者的消息
为了消费消息,订阅者必须保持运行的状态
为了缓和这样严格的时间相关性,JMS容许订阅者建立一个可持久化的订阅。这样,即便订阅者没有被激活(运行),它也能接收到发布者的消息。
消息确认机制
AUTO_ACKNOWLEDGE = 1 自动确认
直接使用receive方法
CLIENT_ACKNOWLEDGE = 2 客户端手动确认
经过消息的acknowledge 方法确认消息
DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
该选择只是会话迟钝第确认消息的提交。若是JMS provider 失败,那么可能会致使一些重复的消息。若是是重复的消息,那么JMS provider 必须把消息头的JMSRedelivered 字段设置为true。
SESSION_TRANSACTED = 0 事务提交并确认
复制代码