关闭

XMPP学习7-发布/订阅

标签: xmpp
217人阅读 评论(0) 收藏 举报
分类:

在XMPP世界里,你已经熟悉发布/订阅模型,因为XMPP原语出席是发布/订阅的一个特殊形式,更多发布/订阅模型的通用形式将由一个专门的XMPP扩展叫做PubSub的提供
直接进入示例(发布订阅整体流程):
订阅ejabberd.org服务上的beta_proclamations节点

<iq from="user@ejabberd.org/Psi"
      id="gh921nx3"
      to="ejabberd.org"
      type="set">
   <pubsub xmlns="http://jabber.org/protocol/pubsub">
      <subscribe node="beta_proclamations" jid="user@ejabberd.org"/>
   </pubsub>
</iq>

订阅成功通知用户(添加了一个subscription属性,值为subscribed指示订阅请求成功)

<iq from="ejabberd.org"
     id="gh921nx3"
     to="user@ejabberd.org/Psi"
     type="result">
  <pubsub xmlns="http://jabber.org/protocol/pubsub">
     <subscription node="beta_proclamations" jid="user@ejabberd.org" subscription="subscribed"/>
  </pubsub>
</iq>

发布博文

<iq from="beta@ejabberd.org"
     id="ma019r58"
     to="ejabberd.org"
     type="set">
  <pubsub xmlns="http://jabber.org/protocol/pubsub">
    <publish node="beta_proclamations">  %%发布条目
      <item>                                                    %%有效载荷
        <entry xmlns="http://www.w3.org/2005/Atom">
          <title>A new thought</title>
          <summary>Off with their heads!</summary>
          <link rel="alternate" type="text/html" href="http://ejabberd.org/1865/"/>
          <id>tag:ejabberd.org,1865:entry-42</id>
          <published>1865-12-13T18:30:02Z</published>
          <updated>1865-12-13T18:30:02Z</updated>
        </entry>
      </item>
    </publish>
  </pubsub>
</iq>

博文发布到节点,给user发送通告(采用消息发送,因为不知用户是否在线,直接交付给XMPP服务器处理)

<message from="ejabberd.org" to="user@ejabberd.org">
  <body>A new thought: off with their heads!</body>
  <event xmlns="http://jabber.org/protocol/pubsub#event">
    <items node="beta_proclamations" id="bl38pahu98h">
      <item id="zi2ba967">
        <entry xmlns="http://www.w3.org/2005/Atom">
          <title>A new thought</title>
          <summary>Off with their heads!</summary>
          <link rel="alternate" type="text/html" href="http://ejabberd.org/1865/"/>
          <id>tag: ejabberd.org,1865:entry-42</id>
          <published>1865-12-13T18:30:02Z</published>
          <updated>1865-12-13T18:30:02Z</updated>
        </entry>
      </item>
    </items>
  </event>
</message>

退订ejabberd.org服务上的beta_proclamations节点

<iq from="user@ejabberd.org/Psi"
     id="vd923k66"
     to= "ejabberd.org"
     type="set">
  <pubsub xmlns="http://jabber.org/protocol/pubsub">
    <unsubscribe node="beta_proclamations" jid="user@ejabberd.org"/>
  </pubsub>
</iq>

退订成功通知用户

<iq from="ejabberd.org"
     id="vd923k66"
     to="user@ejabberd.org/Psi"
     type="result"/>

PubSub配置
PubSub节点配置,面临两个基本的选择:
1 节点发送出去的通告是否将包含有效载荷(配置deliver_payloads选项,产生相应的payload-included节点和notification-only节点)
2 节点发布的条目是否存储以便以后被检索(配置persist_items选项)
Payloads:To send or not to send ?
不带载荷的通告:

<message from="ejabberd.org" to="user@ejabberd.org">
  <event xmlns="http://jabber.org/protocol/pubsub#event">
    <items node="beta_proclamations">
      <item id="zi2ba967"/>
    </items>
  </event>
</message>

Items:To store or not to store ?
订阅某节点特定有效载荷:

<iq from="user@ejabberd.org/Psi"
     id="ka03p485"
     to="ejabberd.org"
     type="get"> 1
  <pubsub xmlns="http://jabber.org/protocol/pubsub">
    <items node="beta_proclamations">
      <item id="zi2ba967"/> 2
    </items>
  </pubsub>
</iq>

节点发现(参考4发现世界)

节点管理
创建beta_Proclamations节点

<iq from="beta@ejabberd.org/Psi"
     id="cr561nd0"
     to="ejabberd.org"
     type="set">
  <pubsub xmlns="http://jabber.org/protocol/pubsub">
    <create node="beta_proclamations"/>
  </pubsub>
</iq>

删除节点

<iq from="beta@ejabberd.org/Psi"
     id="d3l3t41t"
     to="ejabberd.org"
     type="set">
  <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
    <create node="beta_proclamations"/>
  </pubsub>
</iq>

配置节点(通过数据表单配置)
管理节点读取
1 Open access model允许任何人订阅
2 Whitelist access model 仅允许预先选择好的 JIDs 订阅或检索节点
3 Authorize access model 需要节点拥有者批准任何订阅请求
4 Presence access model 允许已经对节点拥有者有出席订阅的那些 JIDs 订阅
5 Roster access model 让你能够限制在特定名册分组的 JID 订阅
示例:
user1只对朋友开放
首先检查当前从属的博客的JID

<iq from="user1@ejabberd.org/Psi"
     id="wl62hf87"
     to="ejabberd.org"
     type="get">
  <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
    <affiliations node="user1’s_blog"/>
  </pubsub>
</iq>
<iq from="ejabberd.org"
     id="wl62hf87"
     to="user1@ejabberd.org/rabbithole"
     type="result">
  <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
    <affiliations node="user1’s_blog">
      <affiliation jid="user1@ejabberd.org" affiliation="owner"/>
      <affiliation jid="gmz@ejabberd.org" affiliation="member"/>
    </affiliations>
  </pubsub>
</iq>

当前user1拥有这个博客节点,gmz允许读取(所属的成员)

user2对每个请求使用授权模型(会收到每个用户订阅的申请批准)
-略

1
0
查看评论

Zookeeper学习(八):Zookeeper的数据发布与订阅模式

1.发布订阅的基本概念      1.发布订阅模式可以看成一对多的关系:多个订阅者对象同时监听一个主题对象,这个主题对象在自身状态发生变化时,会通知所有的订阅者对象,使他们能够自动的更新自己的状态。        2.发布订阅...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2016-03-20 19:48
  • 8642

用 JavaScript 实现发布/订阅模式

重要申明:感谢原文作者——杠子,想看原文请戳这里!我转载了原文,修改了一些原文行文不通畅之处,并更改附上了自己的代码段,望请勿怪。挂在自己的博客下面一方面是为了收藏好文,方便自己温顾而知新;另一方面也希望更多人看到这文章。PS:原文撰写于 2016-08-11。一、发布/订阅模式简介发布/订阅模式(...
  • JimmyLuo17
  • JimmyLuo17
  • 2017-10-03 10:35
  • 259

Meteor发布、订阅

详解: 发布和订阅是meteor的重要部分。 meteor数据库在服务端有mongo 本地有minimongo,这是moteor重写本地mongo。 推送数据库子集到客户端。 这样呢服务器就不需要再发送html到本地了,而是发送直实的原始数据。 让客户端决定如何处理数据。 不用再等待服务...
  • starwmx520
  • starwmx520
  • 2015-11-16 17:24
  • 393

发布/订阅 模式

【https://zh.wikipedia.org/wiki/%E5%8F%91%E5%B8%83/%E8%AE%A2%E9%98%85】 发布/订阅[编辑] 维基百科,自由的百科全书 本条目部分链接不符合格式手册规范。跨语言链接及章...
  • guojin08
  • guojin08
  • 2017-07-04 10:44
  • 164

redis订阅和发布

redis通过PUBLISH、SUBSCRIBE等命令实现了订阅与发布模式,这个功能有两种信息机制,分别是订阅\发布到频道、订阅\发布到模式。 订阅\发布到频道: 频道的订阅与信息发送。 redis的subscribe命令可以让客户端订阅任意数量的频道,每当有信息发送到被订阅的频道时,信息就会...
  • mggwct
  • mggwct
  • 2016-02-29 10:41
  • 707

发布者&订阅者模型

发布者和订阅者模型是软件架构中的消息模式。 1. 第一种是1:n,一个发布者对应多个订阅者。例如汇率和RSS网站。 2. 第二种是n:1,多个发布者对应一个订阅者。例如收集状态,历史记录和数据。 3. 第三种是1:1,特定发布者对应特定订阅者。例如价格报价。 4. 第四种是n...
  • guoduhua
  • guoduhua
  • 2017-02-14 18:11
  • 138

ROS学习(-)基本概念+发布&订阅消息

对ros学习的相关概念、消息发布和订阅、遇到的故障信息进行阶段性总结。
  • mr_ahke
  • mr_ahke
  • 2016-07-29 19:56
  • 2203

数据发布与订阅

发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。 应用中用到的一些配置信息放到ZK上进行集中管理。这类场景通常是这样:应用在启动的...
  • pdw2009
  • pdw2009
  • 2015-08-02 18:48
  • 1255

redis发布与订阅

redis在2.8.0版本之后出了一个新功能,叫Pub/Sub,也叫"发布与订阅"。 在这篇文章中不仅要介绍它是如何用的,更重要的是要介绍它的应用场景。 在之前介绍websocket之用tubesock在rails实现聊天室(五)的时候,就用redis的pub/sub...
  • qwbtc
  • qwbtc
  • 2016-07-23 16:36
  • 877

订阅与发布的实现与应用

每次学习新东西,接触新领域的时候,常常会想学了后能应用到什么地方。用了它能改善什么东西,为什么非他不可? 1.订阅与发布是啥:我个人的理解是:你关注了某个人,他发了一条信息,你能马上知道。 知道了是啥,有哪些技术能实现我需要的这种功能呢:脑海里,网上搜索一番,发现类似的开源产品还是很多的。譬如:...
  • shenbushen
  • shenbushen
  • 2017-03-24 00:23
  • 287
    个人资料
    • 访问:13342次
    • 积分:466
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    最新评论