Apache ActiveMQ - 2 - JMS企业消息传送

这篇笔记,当时参考的资料忘记是哪个了,如果没记错的是,应该是IBM的某篇文章,这里就不记录了..

当时都是以图片的形式记录下来的,因为没有写的必要,权当了解吧...

对于消息中间件有一个较为完整的理解。


Apache ActiveMQ - 2 - JMS企业消息传送



企业消息传送

Apache ActiveMQ - 2 - JMS企业消息传送


什么是面向消息中间件

Apache ActiveMQ - 2 - JMS企业消息传送



Java消息服务(Java Message Service)

JMS是在MOM供应商核心API基础上发展的,它用来提供企业消息传送。JMS的目标是为Java提供一个标准的API来发送和接收消息,并使之成为供应商天生行为。

JMS最小化了Java程序员开发企业消息应用的复杂性,同时还保留在不同JMS提供者之间移植的可能性。

JMS并不是一个MOM。它是一个API,抽象了客户端和MOM的交互,就像JDBC抽象与数据库的交互一样。图2.4展示了客户端是如何通过JMS提供的API和特定JMS提供者交互。

特定的JMS提供者使用供应商制定的API和MOM交互。不只是图示的四种,对于其它JMS提供者也是相同的。

Apache ActiveMQ - 2 - JMS企业消息传送



JMS(Java Message Service)的领域

1. 点对点领域

点对点(PTP)消息传送使用的目标是队列。

通过使用队列,消息可以被异步或同步地发送和接收。每一条到达队列的消息将会被投递到单独一个消费者一次,并且只有一次。

这就好像两个人之间的邮件发送。

消费者可以通过MessageConsumer.receive()方法同步地接收消息或使用MessageConsumer.setMessageListener()方法注册一个MessageListener实现来异步地接收消息

队列保存所有的消息直到它们被投递出去或过期。

Apache ActiveMQ - 2 - JMS企业消息传送


2. 发布订阅领域

发布订阅模式的消息使用主题(topics)作为目标。

发布者发送消息到主题,订阅者从主题接收消息。发送到主题的消息会自动发给所有的订阅者。

这个消息传送领域就像预制一个邮件列表,所有邮件列表上的用户都会受到消息

Apache ActiveMQ - 2 - JMS企业消息传送

就像PTP消息传送一样,订阅者可以通过MessageConsumer.receive()方法同步地接收消息或使用MessageConsumer.setMessageListener()方法注册一个MessageListener实现来异步地接收消息。

主题并不保存消息,除非显式地让它这样做。这个可以通过使用持久订阅(durable subscription)来实现。

使用持久订阅,如果一个订阅者与JMS提供者连接断开,JMS提供者有责任为该订阅者保存消息。

重新连上后,订阅者将收到所有的未过期的消息。持久订阅允许订阅者断开连接而不会丢失任何消息。



持久订阅和消息持久化

持久订阅和消息持久化是JMS经常会混淆的两个概念。虽然它们很类似,但是还是有一些明显的不同,并且它们的用途也不一样。

消息持久订阅只在发布/订阅领域有效。当客户端连接到一个主题上,它们可以选择使用持久或非持久订阅。考虑这两种情况的区别。


1. 持久订阅

1) 一个持久订阅的时间是无限的。客户端注册到主题上,并且告诉JMS提供者当订阅者断开连接时保持订阅状态。如果一个订阅者的连接断开了,JMS提供者将保持所有的消息直到订阅者重新连上或者订阅者取消订阅。


2. 非持久订阅

1) 一个非持久订阅是有限的。客户端注册到主题上并且告诉JMS提供者当连接断开是不用保持订阅状态。如果一个订阅者断开连接,JMS提供者在断开的这段时间里不会保存任何消息。

消息持久化是独立于消息领域的。消息持久化是一种服务质量属性,它用来指出JMS应用处理消息投递失败时的能力。



JMS应用的请求/回复传送机制

虽然JMS规范没有把请求/回复(request/reply)消息传送作为一种正式的消息领域来定义。

当它提供了一些消息头部和许多有用的类来处理请求/回复消息传送。

请求/回复消息传送是一种异步的会话模式,可以在PTP或pub/sub领域使用。

这种模式会用到JMSReplyTo和JMSCorrelationID消息头部及临时的消息目标。

JMSReplyTo指定一个回复消息投递的目标,JMSCorrelationID指定回复消息对应的请求的JMSMessageID。

这些头部用来关联回复消息和它(们)的请求消息。

临时的目标只能在连接持续时间里有效并且只能被创建它的连接使用。这些限制条件使得临时目标对于请求/回复模式很有用。

Apache ActiveMQ - 2 - JMS企业消息传送