前段时间学习EJB。接触到了JMS(Java消息服务),JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和公布订阅模型。

个人认为这两个模型挺easy理解的,由于生活中的样例还挺多的。

1,  P2P模型

有下面概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每一个消息都被发送到一个特定的队列,接收者从队列获取消息。队列保留着消息,直到它们被消费或超时。

(1) 每一个消息仅仅有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

(2) 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后。无论接收者有没有正在执行,它不会影响到消息被发送到队列。

(3) 接收者在成功接受消息之后须要向队列应答成功

注:假设希望发送的每一个消息都被成功处理。或被特定的消费者消费,那么须要採用P2P模型。

使用场合:想让接收者进行且仅仅进行一次处理,组件之间进行同步通信。

个人理解:这样的模型的应用非经常见,比如:qq/微信/飞信聊天(私聊)。(1)小A和小B互加qq好友,小A给小B发一条消息”你干嘛呢?”,这条消息仅仅有小B能接收到。别人接收不到——每一个消息仅仅有一个消费者;(2)假设小B没有登录qq。也没关系。当小B登录qq后,就会看到这条消息——发送者和接收者之间在时间上没有依赖性,也就是说,当发送者发送了消息之后。无论接收者有没有正在执行,它不会影响到消息被发送到队列;

2。Pub/Sub模型

有下面概念:主题(Topic)、公布者(Publisher)、订阅者(Subscriber)。

client将消息发送到主题。

多个公布者将消息发送到Topic。系统将这些消息传递给多个订阅者。

(1)
每一个消息能够有多个消费者

(2) 公布者和订阅者之间有时间上的依赖性。

针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才干消费公布者的消息,并且,为了消费消息,订阅者必须保持执行的状态。

为了缓和这种严格的时间上的依赖性,JMS同意订阅者创建一个可持久化的订阅(即,发送者和接收者之间在时间上没有依赖性。

这种话,即使订阅者没有执行,它也能接收到公布者的消息。)

假设希望发送的消息能够被一个/多个消费者消费,那么能够採用Pub/Sub模型。

个人理解:这种模型的应用也非经常见。比如,假设qq群聊天是这种:小A、小B、小C都是”聊天群”中的成员,小A、小B在线。小C不在线,小A公布一条消息”明天放假”,那么仅仅有小B能接收到,当小C上线后也接收不到。

这样是不是非常不合理——公布者和订阅者之间有时间上的依赖性;因此,为了缓和这种严格的时间上的依赖性,JMS同意订阅者创建一个可持久化的订阅(即,发送者和接收者之间在时间上没有依赖性。这种话。即使订阅者没有执行,它也能接收到公布者的消息。

)——还是上面的样例。小A、小B、小C都是”聊天群”中的成员,小A、小B在线,小C不在线,小A公布一条消息”明天放假”。小B能够接收到。当小C上线后也能够接收到。

以上仅仅是眼下的个人理解,可能与实际有所偏差。

3,总结:

P2P模型与Pub/Sub模型的根本差别:对于p2p模型的每一个消息仅仅能有一个消费者 ; pub/sub模型能够有多个消费者 。

JMS两种消息模型的更多相关文章

  1. rabbitmq五种消息模型整理

    目录 0. 配置项目 1. 基本消息模型 1.1 生产者发送消息 1.2 消费者获取消息(自动ACK) 1.3 消息确认机制(ACK) 1.4 消费者获取消息(手动ACK) 1.5 自动ACK存在的问 ...

  2. 以两种异步模型应用案例,深度解析Future接口

    摘要:本文以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类. 本文分享自华为云社区<[精通高并发系列]两种异步模型与深度解析Future接口(一) ...

  3. 【高并发】两种异步模型与深度解析Future接口

    大家好,我是冰河~~ 本文有点长,但是满满的干货,以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来,打开你的IDE,跟着文章看源码,相 ...

  4. css的两种盒子模型

    css的两种盒子模型:W3C标准盒子模型.IE盒子模型 两者的相同之处:都包含margin.border.padding.content 两者的不同之处:W3C标准盒子模型的content部分不包含其 ...

  5. RabbitMQ之五种消息模型

    首先什么是MQ MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者.消费者模型.生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步的,而 ...

  6. DIV+CSS两种盒子模型(W3C盒子与IE盒子)

    在辨析两种盒子模型之前.先简单说明一下什么叫盒子模型. 原理: 先说说我们在网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS ...

  7. 两种Tensorflow模型保存的方法

    在Tensorflow中,有两种保存模型的方法:一种是Checkpoint,另一种是Protobuf,也就是PB格式: 一. Checkpoint方法: 1.保存时使用方法: tf.train.Sav ...

  8. Java NIO学习与记录(八): Reactor两种多线程模型的实现

    Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...

  9. DIV+CSS两种盒子模型

    盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型.他们对盒子模型的解释各不相同, 先来看看我们熟悉的标准盒子模型: 从上图可以看到标准 W3C 盒子模型的范围包括 margin.bord ...

随机推荐

  1. windows中Appium-desktop配合夜神模拟器的使用

    1.安装Android SDK并配好环境 ANDROID_HOME :C:\Users\18810\AppData\Local\Android\Sdk path:%ANDROID_HOME%\plat ...

  2. TCP的可靠性

    原因: 1.确认和重传机制 2.序列号 3.流量控制(窗口) 4.拥塞控制(慢启动,拥塞避免,快速重传,快速恢复) http://blog.csdn.net/baidu_35692628/articl ...

  3. Image.FromStream与Image.FromFile使用区别

    将一个图片加载并显示在picturebox上,一般情况下得到预期的结果,然而对于同一个filepath, 若连续两次调用下面的语句系统将会报错(如用户多次选择加载同一张图片使用Image.FromFi ...

  4. 一段js代码的分析

    function foo(a){ console.log(a+b); b=a+2; console.log(a+b); } foo(2); foo(3); var b=3; foo(4); 结果是: ...

  5. w3cschool javascript学习

    name与Id属性区别 1.我们知道在网页做Post提交时,是以Form(即表单域)为单位进行提交的,一个Form里有若干个表单对象(如<input type="text" ...

  6. Go嵌入类型及内部提升样例

    这个有点新鲜哟... package main import ( "fmt" ) type notifier interface { notify() } type user st ...

  7. [libgdx游戏开发教程]使用Libgdx进行游戏开发(2)-游戏框架搭建

    让我们抛开理论开始code吧. 入口类CanyonBunnyMain的代码: package com.packtpub.libgdx.canyonbunny; import com.badlogic. ...

  8. codevs 方格取数

    1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  9. C++线段树模板(区间和、区间加)

    操作说明: segtree<T>tree(len) =>创建一个内部元素类型为T.区间为1-len的线段树tree tree.build(l,r) =>以[l,r]区间建立线段 ...

  10. JAVA net 笔记

    1.InetAddress 获取主机ip等 2.URL 3.URLConnection (url.openConnection() 创建对象) 4.BufferedReader 5.InputStre ...