Java消息服务

时间:2021-01-06 15:23:25

什么是消息?

消息是可编程实现两端通信的机制。通常的一些消息技术如:TCP/IP Sockets、管道、文件、共享存储。

Java消息服务

Java消息服务,即Java Message Service(JMS),是一组Java应用程序接口(Java API),它提供创建、发送、接收、读取消息的服务,使得Java程序能够和其他消息组件进行通信。

消息传送机制的优点

1. 异构集成

在完全不同的平台上实现应用程序和系统请求调用服务。消息传送机制提供跨应用程序和子系统共享数据和功能的去耦方案。

2. 缓解系统瓶颈

与一个同步组件处理众多请求时,众多请求一个接一个的积聚阻塞不同,这时候消息会发送到一个消息传送系统,该系统将该请求分发给多个消息侦听器组件(增加漏斗)。如此一来,就缓解了单独采用点对点同步连接带来的系统瓶颈。

3. 提高可伸缩性

通过引入能够并发处理不同消息的多个消息接收者(消息侦听器),消息传送系统的可伸缩性得以实现。

4. 提高最终用户生产率

通过使用异步消息传送机制,用户可以在向系统发出请求后,继续做其他事情。

5. 体系结构灵活性和敏捷性

消息传送机制,能快速地响应软硬件和业务的变化。使用消息传送机制方式,消息生产者或是客户端组件都不会知道接收组件使用的是哪种编程语言或平台,组件或服务位于何处,组件或服务实现的名称是什么,甚至用于访问该组件或服务的是哪种协议。

Java消息服务

企业消息传送

消息是通过网络从一个系统异步传送给其他系统的。在异步消息传送机制中,应用程序使用一个简单的API来构建一条消息,然后再将该消息转发给面向消息的中间件,以便传送给一个或多个的预定接收者。

一条消息就是一个业务数据包,它通过网络从一个应用程序发送给其他应用程序。消息应该是自描述的,因为它包含所有必要的上下文,以便允许接收者独立地完成它们的工作。

消息传送系统由消息传送客户端和几种消息传送中间件服务器所组成。客户端向消息传送服务器发送消息,该服务器随后再将那些消息分发给其他客户端。客户端是使用消息传送API的一个业务应用程序或组件(JMS)。

1. 集中式体系结构

依赖于一台消息服务器(也称消息路由器或代理),它负责从一个消息传送客户端(JMS)向其他消息传送客户端(JMS)传送信息,实现一个发送客户端和其他接收客户端之间的解耦。客户端仅仅看到消息传送服务器,而不会看到其他客户端,这将允许在不会影响系统整体的情况下添加和删除客户端。通常,集中式体系结构使用的是星型的拓扑结构。

2. 分布式体系结构

使用网络层IP组播,没有集中服务器,一些服务器功能(持久性、事务和安全性)作为一个客户端的本地部分嵌入进来,而此时消息路由则利用IP组播协议委托给网络层。

消息传送模型

JMS支持两类消息传送模型(消息传送域):点对点模型(P2P)和发布/订阅(Pub/Sub)模型。点对点模型设计用于一对一消息传送,发布/订阅模型设计用于一对多消息广播。

1. 点对点模型

JMS客户端通过队列(queue)这个虚拟通道来同步和异步发送、接收消息,基于拉取(Pull)或者基于轮询(Polling)的消息传送模型,这种模型从队列中请求消息,而不是自动地将消息推送给客户端。耦合性比Pub/Sub模型更强。

Java消息服务

2. 发布/订阅模型

消息会被发布到一个名为主题(topic)的虚拟通道中,基于推送(Push)的模型,消息自动地向消费者广播,它们无须请求或轮询主题来获得新消息,每个订阅者都会接受到发布者所发送的消息的一个副本。去耦能力比P2P模型更强。

Java消息服务

传送消息方式

JMS现在有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。

如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要接收所有的消息时才使用。

JMS API

JMS本身并不是一种消息传送系统,它是消息传送客户端和消息传送系统通信时所需接口和类的一个抽象。JMS抽象可以访问消息提供者。使用JMS,应用程序的消息传送客户端可以实现跨消息服务器产品的移植。

JMS API分为3个主要部分:公共API、点对点API和发布/订阅API。公共API被用于向一个队列或一个主题发送和接收消息,点对点API专门用于队列,发布/订阅API则专门用于主题。

在JMS公共API内部,和发送与接收JMS消息有关的JMS API接口主要有7个:ConnectionFactory、Destination、Connection、Session、Message、MessageProducer、MessageConsumer。

在这些公共接口中,ConnectionFactory、Destination必须使用JNDI从提供者处获得。其他接口则可以通过工厂方法在不同的API接口中创建。

1. 点对点API

向一个队列发送和接收消息的接口:QueueConnectionFactory、Queue、QueueConnection、QueueSession、Message、QueueSender、QueueReceiver。

2. 发布/订阅API

内部接口:TopicConnectionFactory、Topic、TopicConnection、TopicSession、Message、TopicPublisher、TopicSubscriber。

JMS客户机

JMS客户机是指生产或消费消息的Java程序,Destination(目的)是JMS服务器上消息等待处理的地方。

Java消息服务

参考文章:

1. Java消息服务学习笔记(1)

2. Java消息服务