1 ActiveMQ 开篇:ActiveMQ 和 JMS

ActiveMQ 开篇:ActiveMQ 和 JMS

读完本片文章,将会了解

  • 什么是ActiveMQ
  • ActiveMQ和JMS的关系
  • JMS的相关特性

ActiveMQ和JMS的关系

在了解activeMQ之前,非常有必要了解下JMS。因为activeMQ是JMS的一种实现,所以了解了JMS也就对activeMQ有了大概的了解。当然activeMQ在JMS规范的基础上也有自己的扩充

如何理解JMS和activeMQ的关系呢?

在我们做WEB开发的过程中,肯定会用到数据库,数据库有很多中,Oracle、MySQL、MSSql等等,虽然数据库有很多种,但是JAVA对数据库的操作仅仅定义了统一的接口(俗称JDBC),无论是哪一种数据库,我们只需要将其对应的jar放到项目中,在使用的时候加载不同的数据源就可以了。那么上面提到的统一接口(JDBC)实际上就是一种操作数据库的规范,当这个规范定义好之后,各个数据库厂家按照规范去实现针对自己数据库的实现。

JMS和ActiveMQ则类比于上面的JDBC和MySql驱动,ActiveMQ是JMS的一种实现,如果说一天,我们也实现了JMS的接口定义,可以说我们也创造了一个 “xxxMQ”。

JMS的相关特性

按照上面的解释,只要先了解了JMS(接口定义),可以说就了解了ActiveMQ。

JMS提供了两种消息的处理方式。

  • Point-To-Point (端到端)。
  • Publish/Subscribe (发布与订阅)。

Point-To-Point

Point-To-Point端到端这种模式简称P2P。该种模式下生产者生产的的一条消息,只会被一个消费者所消费,如下图所示:

P2P消息模型

上图中小信封则代表一个消息,当生产者将消息发送到队列之后即被保存起来,无论连上这个队列的消费者有几个,只会有一个消费者会接收到方才发送的消息。

如果所有的消费者都不在线,也没有关系,因为消息已经被保存,所以当消费者重新上线则会接收到该消息。

Point-To-Point是一种拉取数据的模型,消费者定时去取,如下图所示: 
这里写图片描述

Publish/Subscribe

Publish/Subscribe发布和订阅模式简称pub/sub模式,该模式下,发布者发布的消息发送到主题后,只要当前正在订阅该主题的订阅者,都会收到消息。如下图所示:

pub/sub模型

当消息发布后,如果没有订阅者订阅,消息将会丢失,所以为了解决这种问题,订阅者分为两种。

  • 持久订阅
  • 非持久订阅

持久订阅

当消息发布到主题后,持久订阅者即使当前不在线,当重连后,则会接收到该主题中尚保存的消息。

非持久订阅

当消息发布到主题后,尚未连接的订阅者,将不会收到消息,及时重新连接。

Publish/Subscribe模式是一种推送模式,如下图所示:

pub/sub推送模型

JMS特性的对比

现对JMS的P2P 和 Pub/Sub做一个对比

Point -to-Point(Queue) Publish-Subscribe(Tobic)
每一个消息都被发送到一个叫做队列(queue)的虚拟通道中 每一个消息都被发送到一个叫做“主题”(topic)的虚拟通道中
它是一种 ”1 对 1 “ 的消息消息模型,e.g. 生产者产生的消息只被一个消费者消费 他是一种“一对多”的消息模型,e.g. 生产者(publisher)产生的消息可以被多个0或多个消费者(subscriber)所消费
一个队列中可以有多个消费者,但是每一个消息只可能被一个消费者消费 一个主题可以有多个消费者并且每个消费者都会接收到这个消息的副本
它是一种“拉取”的消息模型,e.g. 客户端轮训队列中的消息 他是一种“推送”的消息模型,e.g. 消息可以被广播到多个消费者,消费者无需去轮训主题
直到消息被消费者消费,否则消息一直会被保留。被生产者发送的消息,即使消费者暂时处于非活动状态,一旦消费者被激活,就会接收到消息 直到所有当前处于活动状态的消费者(订阅者)接收到消息之前,消息都会被保存在“主题”中,但是会出现一种情况,消费者此时处于断开状态,当消费者再次连接后,以前发送到该主题的消息则不会接收到。如果想要在消费中重连后接收到消息,则要使用”持久订阅”机制
对于已经成功处理的消息,消费者会向消息中心发送确认信息 确认机制是可选项

针对 上面的六点,总结一句话 就是 :    Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。