JMS基本概念

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(消息可能会丢失,但不会被传递两次)
  •  其他。。。
 B、Properties与Headers有点类似;
 C、Payload:存储JMS实际消息的地方。可以以text形式、二进制形式存储消息。

9) JMS Selector:有时候JMS客户端订阅给定的目的地,但是它可能想要过滤它接收到的消息的类型,于是JMS Message中headers和properties可以派上用场了,消息选择器允许JMS客户机根据消息头中的值指定要从目标接收哪些消息。


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存储消息。

使用持久预订,当订户断开与JMS提供商的连接时,JMS提供商有责任为订户存储消息