-
Notifications
You must be signed in to change notification settings - Fork 1
ActiveMQ In Action读书笔记(一)
- 兼容JMS1.1规范
- 连接性: activeMQ对多种协议(HTTP/S, IP multicast, SSL, STOMP, TCP, UDP,XMPP)等等提供了支持
- 可插拔的存储和安全支持
- Java实现
- 与应用服务器集成
- 丰富的clien api支持: 除了Java, 还包括C/C++, .NET, Perl, PHP, Python, Ruby等等
- broker集群
- 对broker和client的高级配置
- 动态轻便的管理
何时使用:
- 异构系统集成
- 作为rpc调用的替换
- 系统解耦
- 作为事件驱动架构的主干
- 提升应用的扩展性
-
Producer(javax.jms.MessageProducer): 消息生成者. destination在Session.createProducer()时指定, 但可以在MessageProducer的send()方法中被覆盖
-
Consumer(javax.jms.MessageConsumer): 消息消费者.可通过receiver()方法同步消费消息, 也可通过MessageListener异步消费消息. destination在Session.createConsumer()时指定.
-
Provider: 由遵循JMS的厂商实现. 比如ActiveMQ等等
-
Message: message由两部分组成: header和payload. header又分为两块: jms规范定义(get/set JMSXXX()方法)的和自定义的(get/set XXXProperty()方法). JMS规范关于一些自动设置的Message Header的说明:
- MSDestination: 消息目的地
- MSDeliveryMode: 分为可持续性(Persistent)和非可持续性(Nonpersistent). 可持续性情况下消息不会丢失,并且发送方式为once and only once, 非可持续性情况下消息会丢失, 发送方式为at most once
- JMSExpiration: 消息存活时间. 默认为0, 表示永不失效.可通过MessageProducer.setTimeToLive()方法设置, 也可通过MessageProducer.send()方法覆盖.
- JMSMessageID: 消息标识id. 可通过MessageProducer.setDisableMessageID(true)将此字段设置为null
- JMSPriority: 消息优先级.从0(lowest)到9(highest).JMS规范并没有要求厂商提供者按优先级发送, 尽管大多数厂商是这么实现的.
- JMSTimestamp: 消息发送时间戳.指的是消息从producer发送到provider的时间戳. 可通过MessageProducer.setDisableMessageTimestamp(true)将此字段设置为0
可选的可由client设置的Message Header,说明如下:
- JMSCorrelationID: 用于关联当前消息和上一个消息, 一般用于对消息请求进行相应的情况
- JMSReplyTo: 消息回复发送destination. 用于消息请求/应答方式
- JMSType: 用于语义的表明消息类型. 没什么太大作用
可选的可由provider设置的Message Header,说明如下:
- JMSRedelivered: 用于表明发送的消息有没有被响应(ack)
自定义的header可由property来表示, 这里也分为两块: 自定义的和JMS扩展规范的(JMSX开头)
-
Message Selector: consumer可根据消息选择表达式来消费指定的消息, 比如
SYMBOL = 'AAPL'
. Message Selector只针对header和properties, 不针对payload -
Message Body: JMS定义了6中body数据.分别为:
- Message: 包含header和payload
- TextMessage:文本消息
- MapMessage: map消息
- BytesMessage: 字节数组消息
- StreamMessage: 流消息
- ObjectMessage: 对象消息
-
Domain: JMS规范了两种domain类型: P2P和Pub/Sub
-
P2P:对应的destination为queue.多个consumer可以注册到同一个queue中, 但只有其中一个consumer能消费消息.一般采用轮询的方式. queue模式下消息默认会保留, 因为这种方式确保消息会被递送 once and only once
-
Pub/Sub: 对应的destination为topic.可明确设置消息是否持久定义(durable subscription),这样当consumer断开重连时, provider会将消息重新发往consumer
Message Durability和Message Persistence的区别: Message Durability是在pub/sub模式下才有意义, 指的是客户端注册到主题上,并且告诉jms提供者当订阅者断开连接时保持订阅状态; Message Persistence指消息是否持久化. 这是通过JMSDeliveryMode为PERSISTENT或NON-PERSISTENT来设定.
-