logo头像

生活多彩,尽情享受!

JMS和AMQP

JMS介绍

JMS简介

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件的API,用于俩个应用程序之间或分布式系统中发送消息,进行异步通信。
JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity)。

JMS体系架构

JMS由以下元素组成:

名称 说明
JMS提供者 连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
JMS客户 生产或消费基于消息的Java的应用程序或对象。
JMS生产者 创建并发送消息的JMS客户。
JMS消费者 接收消息的JMS客户。
JMS消息 包括可以在JMS客户之间传递的数据的对象。
JMS队列 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题 一种支持发送消息给多个订阅者的机制。

JMS对象模型

名称 说明
ConnectionFactory 创建Connection对象的工厂,针对两种不同的JMS消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。
Connection Connection表示在客户端和JMS系统之间建立的连接(对TCP/IP socket的包装)。Connection 可以产生一个或者多个Session跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。
Session Session是操作消息的接口。可以通过session创建生产者、消费者消息等。Session提供了事务的功能。当需要使用session发送/接收多个消息是,可以将这些发送/接收动作放到一个食物中。同样也分QueueSession和TopicSession。
MessageProducer 消息生成者由Session创建,并用于将消息发送到Destination。同样,消息生产者分为两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。
MessageConsumer 消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的createDurableSubscriber方法来创建持久化的订阅者。
Destination Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。

JMS消息模型

在JMS标准种,有两种消息模型PTP(Point to Point),Publish/Subscribe(Pub/Sub)。

PTP模式(点对点消息传送模型)

在点对点消息传送模型种,应用程序由消息队列,发送者,接收者组成。每一个消息发送个一个特殊的消息队列,该队列保存了所有发送给他的消息(除了被接收者消费掉的和过期的消息)


特点:
1.每个消息只有一个消费者,一旦被消费,消息就不再存在消息队列种。
2.发送者和接收者之间在时间上没有依赖性。即发送者发送了消息之后,无论接收者有没有运行,它都不会影响到消息被发送到队列。
3.接收者再成功接收到消息之后,需要向队列发送确认收到通知。

Pub/Sub(发布/订阅消息传递模型)

在发布/订阅消息模型种,发布者发布一个消息,该消息通过topic传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅topic。
在发布/订阅消息模型中,目的地被称为主题(topic),topic主要用于保存和传递消息,且会一直保存消息,直到消息被传递给客户端。


特点:
1.每个消息可以有多个消费者。
2.发布者和订阅者之间有时间上的依赖。针对某个主题(topic)的订阅者,它必须创建一个或者多个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保存运行状态。
3.为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有运行,它也能接收到发布者的消息。

接收消息

在JMS中,消息的接收可以使用一下两种方式:

名称 说明
同步 使用同步方式接收消息,消费订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间之前,方法会阻塞,直到消息可用。
异步 使用异步方式接收消息,消费订阅者需要注册一个消息监听者,类似与事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()递送消息。

JMS消息结构

消息主要由三部分组成,分别是Header,Properties,Body:

名称 说明
Header 消息头,所有类型的这部分格式都一致
Properties 属性,按类型可分为应用设置的属性,标准属性和消息中间件定义的属性
Body 消息正文,我们需要传输的消息内容

JNDI

JNDI(Java Naming and Directory Interface ,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口的实现,又管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。

AMQP协议介绍

AMQP(Advanced Message Queuing Protocol/高级消息队列协议),是应用层协议的一个开放标准,为面向消息的中间件设计。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
AMQP在消息提供者和客户端行为进行了强制规定,使不同厂商之间真正实现了互操作能力。
AMQP是一个Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流。因此任何遵守此数据格式的工具,其创建和解释消息,都能与其他兼容工具进行互操作。

AMQP规范的版本:
0-8 是2006年6月发布
0-9 于2006年12月发布
0-9-1 于2008年11月发布
0-10 于2009年下半年发布
1.0 2012年10月31日AMQP 1.0成为OASIS标准

JMS和AMQP的区别

通信平台的区别

名称 说明
JMS 只允许基于Java实现的消息平台之间进行通信
AMQP 运行多种消息协议进行通信,如ruby的storm和java的jms都可以在AMQP上进行通信。
AMQP允许多种技术同时进行协议通信

通信机制的区别

名称 说明
JMS 消息生产者和消息消费者必须知道对方的Queue
AMQP 消息生产者和消息消费者无须知道对方的Queue,消息生产者将Exchange通过Route key和任意Queue绑定。消息消费者通过Route key从任意Queue中获取Exchange.

消息传输机制的区别

名称 说明
JMS 支持PTP和publis/subscribe机制,PTP只可以点对点通信,public/subscribe在一端发出请求后所有其他端收到消息
AMQP 所有RouteKey相同的Queue接受到数据; 所有相同的Exchange的Queue接受到数据 ;所有wilecard的Exchange的Queue接受到数据; 可以让webservice等接受到数据

参考:
https: //www.cnblogs.com/Zender/p/9098410.html#_label1
https: //www.cnblogs.com/myibm/p/7919073.html
https: //www.cnblogs.com/qwangxiao/p/9237948.html