Skip to content

ActiveMQ In Action读书笔记(一)

18965050 edited this page Jul 3, 2017 · 2 revisions

ActiveMQ特性

  • 兼容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的高级配置
  • 动态轻便的管理

何时使用ActiveMQ

rpc调用方式-紧耦合

mom调用方式-松耦合

何时使用:

  • 异构系统集成
  • 作为rpc调用的替换
  • 系统解耦
  • 作为事件驱动架构的主干
  • 提升应用的扩展性

JMS

  • 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 p2p

    • Pub/Sub: 对应的destination为topic.可明确设置消息是否持久定义(durable subscription),这样当consumer断开重连时, provider会将消息重新发往consumer pubsub

    Message Durability和Message Persistence的区别: Message Durability是在pub/sub模式下才有意义, 指的是客户端注册到主题上,并且告诉jms提供者当订阅者断开连接时保持订阅状态; Message Persistence指消息是否持久化. 这是通过JMSDeliveryMode为PERSISTENT或NON-PERSISTENT来设定.