ActiveMQ教程(6)— JMS规范中的几个基本概念

转载 2018年04月17日 19:54:13

由于ActiveMQ是JMS规范的完整实现,所以为了讲清楚ActiveMQ是如何进行存储和调度的,就需要首先说明JMS中和存储、调度有关的几个概念。它们是:

  • 消息收发模式(订阅-发布和负载均衡模式);
  • 消息存储模式(持久化消息和非持久化消息);
  • 订阅模型(持续订阅和非持续订阅)。

订阅发布模式和负载均衡模式


在上篇文章中我们已经详细讲解过订阅-发布模式和负载均衡模式。在ActiveMQ的官方文档中的描述,他们的英文名称分别是TopicsQueue。这两种消息“发送-接受”模式,都是JMS规范中的标准模式。

订阅-发布模式

这里写图片描述
在“订阅-发布”模式下,消息会被复制多份,分别发送给所有“订阅”者。实际上在后文的描述中您将看到,这个复制的过程实际上没有您想象的简单。

负载均衡模式

这里写图片描述
在“负载均衡”模式下,一条消息将会发送给一个消息消费者,如果当前Queue没有消息消费者,消息将进行存储。同样通过后文的介绍,您会发现这其中的过程也并不简单。

持久化消息和非持久化消息


JMS中对非持久化消息和非持久化消息的称呼分别是:NON_PERSISTENT MessagePERSISTENT Meaage。它们指的是消息在任何一种“发送-接受”模式下(“订阅-发布”模式和“负载均衡模式”),是否进行持久化存储。

NON_PERSISTENT Message只存储在JMS服务节点的内存区域,不会存储在某种持久化介质上(后面我们要介绍到AcitveMQ可支持的持久化介质有:KahaBD、AMQ和关系型数据)。在极限情况下,JMS服务节点的内存区域不够使用了,也只会采用某种辅助方案进行转存(例如ActiveMQ会使用磁盘上的一个“临时存储区域”进行暂存)。一旦JMS服务节点宕机了,这些NON_PERSISTENT Message就会丢失。

JMS中对PERSISTENT Meaage的定义是:这些消息不受JMS服务端异常状态的影响,JMS服务端会使用某种持久化存储方案保存这些消息,直到JMS服务端认为这些PERSISTENT Meaage被消费端成功处理。例如ActiveMQ中可以选择的持久化存储方案就包括:KahaDB、AMQ和关系型数据库。

在JMS标准API中,使用setDeliveryMode标记消息发送者是发送的PERSISTENT Meaage还是NON_PERSISTENT Message。示例如下:

......
for(int index = 0 ; index < 10 ; index++) {
    TextMessage outMessage = session.createTextMessage();
    outMessage.setText("这是发送的消息内容:" + index);
    if(index % 2 == 0) {
        sender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    } else {
        sender.setDeliveryMode(DeliveryMode.PERSISTENT);
    }
    sender.send(outMessage);
}
......

那么当JMS服务节点重启后(注意不是producer重启),以上代码中发送的10条消息只有其中5条消息能够保存下来。

持续订阅和非持续订阅


持续订阅和非持续订阅,是针对“订阅-发布”模式的细分处理策略,在JMS规范中的标准称呼是:Durable-SubscribersNon-Durable Subscribers

Durable-Subscribers是指在“订阅-发布”模式下,即使标记为Durable-Subscribers的订阅者下线了(可能是因为订阅者宕机,也可能是因为这个订阅者故意下线),“订阅-发布”模式的Topic队列也要保存这些消息(视消息不同的持久化策略影响,保存机制不一样),直到下次这个被标记为Durable-Subscribers的订阅者重新上线,并正确处理这条消息为止。换句话说,标记为Durable-Subscribers的订阅者是否能获得某条消息,和它是否曾经下线没有任何关系。

Non-Durable Subscribers是指在“订阅-发布”模式下,“订阅-发布”模式的Topic队列不用为这些已经下线的订阅者保留消息。当后者将消息按照既定的广播规则发送给当前在线的订阅者后,消息就可以被标记为“处理完成”。

项目实战:ActiveMQ开发大型分布式系统

消息中间件是搭建大型企业级项目必不可少的成员,只有掌握了消息中间件的使用和应用场景,才能开发真正的大型分布式系统。 ActiveMQ支持JMS,是apache的顶级项目,在全球开源消息中间件中影响力最大!
  • 2017年08月14日 15:46

深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单。。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2015-09-26 13:37:47
  • 97467

JMS的规范,以及ActiveMQ中p2p和publish/subscriber2中模式

JMS规范文档地址如下: http://udn.yyuap.com/doc/JMS2CN/01_introduction/index.html JMS是什么?             J...
  • qq383264679
  • qq383264679
  • 2016-04-15 18:02:45
  • 1377

Java ActiveMQ 理解JMS 和 ActiveMQ基本使用

最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢。最近几天研究了下,把自己所有看下来的文档和了解总结一下。 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:...
  • JameBing
  • JameBing
  • 2016-11-24 15:35:46
  • 19657

深入浅出JMS(二)--ActiveMQ简单介绍以及安装

现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2015-07-31 00:11:24
  • 114867

深入浅出JMS(一)--JMS基本概念

摘要:JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2015-06-30 22:23:25
  • 150999

一头扎进 JMS 之 ActiveMQ 视频教程

一头扎进 JMS 之 ActiveMQ 视频教程参考“www.java1234.com”视频,适合入门,只简单d介绍工作的中常用的两种方式1:点对点消息实现,2:发布-订阅消息模式实现...
  • kinbridge
  • kinbridge
  • 2016-09-25 15:23:00
  • 2810

ActiveMQ系列—JMS规范中的几个基本概念

由于ActiveMQ是JMS规范的完整实现,所以为了讲清楚ActiveMQ是如何进行存储和调度的,就需要首先说明JMS中和存储、调度有关的几个概念。它们是:消息收发模式(订阅-发布和负载均衡模式)、消...
  • u012758088
  • u012758088
  • 2017-09-20 08:58:15
  • 305

JMS+activeMq+spring简单学习及模拟处理新闻日志场景

学习jms+activeMq+spring过程中的一些整理
  • dream_broken
  • dream_broken
  • 2015-02-13 10:55:57
  • 1500

JMS之ActiveMQ视频教程

  • 2017年11月09日 13:58
  • 48B
  • 下载
收藏助手
不良信息举报
您举报文章:ActiveMQ教程(6)— JMS规范中的几个基本概念
举报原因:
原因补充:

(最多只允许输入30个字)