1、面向消息的中间件:
Message-oriented middleware (MOM)——面向消息的中间件主要就是为了降低各个应用程序之间的耦合,引入MOM好处有:
1)可以做到 不必要求发送者和接收者同时“在线”(actived)才能进行消息通信。发送者只管把消息发给MOM,然后可以“离开”,接收者可以在随后任何时间去取(取决于何种通信模式)即,发送者不需要知道接收者的存在,且可进行异步通信。
2)MOM还可以提供一些额外的功能:比如,消息的持久化(message persistence)、消息的转化、消息之间的路由……而这些在未引入MOM系统中很难实现的。
3)支持各种各样的连接协议,即Client可以通过如HTTP/TCP....协议连接MOM。
4)提供了相应的API发送及接收消息。
2、为什么有JMS?
上面介绍了MOM的好处,正因为现实中存在许许多多的MOM厂商,他们开发出不同的MOM产品,如Apache的ActiveMQ,如WebSphereMQ....每家的MOM产品都有一套自己的发送、接收消息的API,因此,不同产品之间兼容性,和操作的统一性就出了问题。从而就出现了JMS。
从上图看出:JMS 客户端通过JMS 规定的API 访问 各种各样的基于JMS协议的消息中间件产品。这与Client 访问 数据库的方式十分相似。
每一家JMS都有自己的产品,如Apache ActiveMQ,每家公司都遵守JMS协议来为自己的产品开发出接口。而用户只需要与统一的JMS API打交道。
在数据库领域,有MySQL、Oracle、SQLSERVER……,但用户程序只需要通过JDBC就可以来访问各种数据库。
3、JMS基本概念:
1)JMS Producer :一个进程,用来生产JMS messages,发到消息中间件;
2)JMS Consumer :一个进程,从消息中间件中消费JMS messages;
3)JMS Domains:消息类型,有两种,点对点模型和发布订阅模型;
4)JMS Provider .相当于各个开发出JMS产品的厂商;
5)Administered Objects:预配置的JMS对象,包含提供程序特定的配置数据以供客户端使用。这些对象通常由客户端通过JNDI访问。
6)Connection Factory:客户端使用连接工厂来创建到JMS中间件的连接;
7)Destination:消息被寻址和发送的对象以及接收消息的对象。
8)JMS Message:一个JMS消息由三部分组成:Headers、Properties、Payload,
A、Headers包含该消息的属性:
- JMSDestination:消息要发送到哪里;
- JMSDeliveryMode:消息的传递模式,有两种:Persistent(在该模式下,provider宕机了,消息不会丢失,且消息只会传递一次。)和Non-Persistent(消息可能会丢失,但不会被传递两次)
- 其他。。。
4、补充一点:
JMS Domain---消息传输模型有两种:
1)p2p:点对点,使用队列传输,消息只能发送给唯一的一个consumer。它支持同步通信和异步通信,同步通信使用MessageConsumer.receive()来接收消息。异步通信需要MessageListener监听器的支持。
2)topic:发布-订阅模型传输的目的地是Topics。JMS采用Push方式,即主动地把消息推送给订阅者。发布-订阅模型中有两种订阅方式,一种是持久订阅(Durable subscriptions),另一种是非持久订阅。
A、非持久订阅:只有当 Client与JMS Provider(如,ActiveMQ)保持连接状态才能收到发送到某个Topic的消息。若Client处于离线,这个时间段发送到Topic的消息会丢失。
B、持久订阅:当client与JMS provider断开时,JMS provider有责任为client存储消息。