java消息服务学习之JMS概念

时间:2022-01-22 16:24:51

JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

JMS基本构件包括:

受管理对象:连接工厂和目的地

连接

会话

JMSContext对象:它将一个连接和一个对话结合在一个对象中

消息生产者

消息消费者

消息

将这些对象集成在一个JMS对象中:

java消息服务学习之JMS概念

JMS应用架构由以下几个部分构成:

JMS提供者:是一个实现JMS接口的消息传送系统。提供管理和控制特性。支持全部特性的JAVA EE平台就包括一个JMS提供者。

JMS客户端:是用java语言编写的程序或组件。可以生成(生产)或使用(消费消息)。所有JAVA EE应用组件都可以作为一个JMS客户端。

消息          :是在JMS客户端之间传递信息的对象。

受管理对象:是为客户端配置的JMS对象。有两类JMS受管理对象:目的地和连接工厂。管理员可以创建公共可用的对象。

消息传送方式:

因为在JMS API出来之前,大多数消息传送产品都支持点对点或发布/订阅传送方式。JMS规范为这两种方式都定义了兼容模式。JMS提供者必须实现这两种方式,JMS API还分别提供了这两种方式特定的接口。

点对点消息传送方式:

点对点产品或应用是建立在消息队列、发送者和接受者的概念基础上。建立队列来维护消息,每个消息都发送到特定对列上,接收客户端从这些队列中抽取信息。队列会保留发送给他们的所有消息,知道消息被使用或到期。

点对点消息消息传送的特点:

每个消息都只有一个消费者(即使用方)。

接收者可以获取信息,而不论客户端发送消息时接收者是否正在运行。

点对点消息传送模型:

java消息服务学习之JMS概念

如果每一个消息都必须由一个消费者成功地处理,就可以使用点对点消息传送。

发送/订阅消息传送方式

在一个发送/订阅产品或应用中,客户端将消息发送到一个主题,它的功能类似于公告板。发布者和订阅者可以动态地向主题发布或订阅。会有多个发布者向主题发送消息,系统将到达主题的消息发布给主题的多个订阅者。主题只是在向订阅者发布消息时才保留消息。

采用发布/订阅消息发布方式时,要区分订阅主题的消费者(订阅者)和所创建消息的订阅,消费者是应用中的一个JMS对象,而订阅是JMS提供者中的一个实体。一般地,一个主题可以有多个消费者,但是一个订阅只有一个订阅者。不过,有可能创建共享地订阅。

发布/订阅消息传送有以下特点:

每个消息可以有多个消费者。

对于订阅一个主题的客户端,只有这个客户端创建一个订阅之后才能使用所发送的消息,消费者必须保持活跃状态才能使用消息。

JMS API允许应用创建持久订阅,利用持久订阅,消费者不活动时也可以接收发送的消息。持久订阅提供了队列的灵活性和可靠性。而且允许客户端向多个接收方发送消息。

如果每个消息可以由任意多个消费者(或者没有任何消费者)处理,就可以使用发布/订阅消息传送方式

发布/订阅消息传送模型:

java消息服务学习之JMS概念

JMS应用中的两个部分(目的地和连接工厂)通常采用管理方式而不是编程方式来维护。对于JMS的不同实现,这些对象的底层技术可能有很大差别。因此这些对象的管理也会随提供者的不同而不同。

JMS连接工厂:

连接工厂是客户端用来创建连接的对象,客户端可以用它来创建与一个提供者的连接。连接工厂封装了由管理员定义的一组连接配置参数。每个连接工厂是ConnectionFactory、QueueConnectionFactory或TopicConnectionFactory接口的一个实例。

在JMS客户端程序最前面,通常要将一个连接资源注入到一个ConnectionFactory对象。Java EE服务器必须提供一个逻辑JNDI名为 java:comp/DefaultJMSConnectionFactory的JMS连接工厂,实际的JNDI名由具体实现确定。

JMS目的地:

客户端用目的地对象指定所生成消息的目标以及所使用消息的来源。在PTP消息传送方式中 目的地成为队列 。在发布/订阅消息传送方式中,目的地成为主题。JMS队列可以使用对个对象或主题(或者两者都使用)

要使用GlassFish服务器创建一个目的地,可以创建一个JMS目的地资源并为目的地指定一个JNDI名。

在JMS的GlassFish服务器实现中,每个目的地资源指示一个物理服务器,可以显示地创建一个物理目的地,不过如果没有创建物理,应用服务器便会在需要时创建,并在删除目的地资源时将其删除。

除了将连接工厂资源注入到客户端程序外,通常还需要注入一个目的地资源。与连接工厂不同,目的地特定于点对点或发布/订阅消息传送方式。要创建一个允许对主题和队列使用相同代码的应用,需要将目的地赋值给一个Distination对象。

连接:

连接是封装了一个与JMS提供者的虚拟连接。例如,连接可以表示客户端与服务者后台之间的一个打开的TCP/IP socket。在Java EE平台中,只有应用客户端能够为一个连接创建多个会话。在web 和企业bean组件中,一个连接最多只能创建一个会话。通常通过创建JMSContext对象来创建连接。

会话:

会话是生成和使用消息的一个单线程上下文。

通常会通过创建一个JMS对象来创建会话(以及连接)。可以使用会话来创建消息生产者,消息消费者,消息,队列浏览器和临时目的地。

会话将串行化消息监听器地执行。

会话提供了一个事务上下文,利用它将一组接收和发送操作分组到一个原子工作单元。

摘自《Java EE 7权威指南 卷2》