Subscriptions 运行机制

深入理解 ASP.NET Cache 运行机制与实战避坑指南 ASP.NET Cache 是 .NET Framework 时代基于 System.Web.Caching.Cache 的服务器内存缓存组件,虽被 ASP.NET Core 的 IMemoryCache 取代,但其自动过期、依赖联动、优先级淘汰和回调通知等核心设计思想仍深刻影响现代缓存架构。它并非简单字典,而是具备完整生命周期管理的可控缓存系统,适用于金融、政务等强一致性要求的存量系统优化。理解其与 AppDomain 绑定、内存压力感知、CacheExpiresThread 工作机制及 SqlCache 阅读详情

SubscriptionsJabber中最复杂的部分。服务端和客户端做了大量的工作,以保证用户在不同状态下接收或发送正确的subscription请求,接受或拒绝其他用户的请求,取消订阅,删除花名册条目,等等。本文档着重解释subscription在两层结构中是如何工作的:(1XML协议要求对特定动作进行响应;(2user:xml文件的返回状态包括Jabber User(如 订阅者等等)以及联系人(如被订阅者)。

2、Subscription 状态

总共有四种subscription状态:

1、  None——Jabber用户和联系人互相都不订阅对方的presence

2、  To——Jabber用户被联系人的presence订阅,但联系人并不被Jabber用户的presence订阅。

3、  From——联系人接受来自Jabber用户的subscription,但联系人不被Jabber用户的presence所订阅(这样的结果就是Jabber用户在联系人的花名册中“不可见”)。

4、  Both——Jabber用户和联系人被彼此的presence订阅。

Jabber用户将联系人加入他的花名册中(通常是通过对联系人发送一个subscriptiong请求实现),名义上还存在第五种状态,就是Jabber用户和联系人甚至不知道对方的存在(至少通过每一个用户的花名册显示)。不过,我们对这种状态没有命名。从本文档出发,我将这种状态定义为初始状态。

3、 订阅一个联系人

就象上面提到的,subscriptions和以及它们相关联的花名册状态是相当复杂的。所以这里我将把一个Jabber用户与一个联系人之间的交互进行极其详尽的描述,以便你能搞清楚当一个Jabber用户订阅一个联系人的presence,结果引起该Jabber用户对联系人产生了一个subcription这样的过程中,究竟发生了些什么。我们将从Jabber用户对联系人发送一个subscription请求开始。

       1、为了让联系人在Jabber用户的花名册上可见,Jabber用户客户端

(1)    发送一个<iq/>包,其jabber:iq:roster名字空间中包含一个type=’set’

(2)    成功的情况下,从服务器接收到一个<iq/>包,其type=’result’

(3)    从服务器接收到一个“roster push”,产生一个新的roster条目,其subscription状态置为“none”:

 

JABBER USER SENDS:

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’contact@host’

name=’contact’/>

</query>

</iq>

 

JABBER USER RECEIVES:

<iq

type=’result’

from=’jabberuser@host/work’

to=’jabberuser@host/work’/>

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’contact@host’

subscription=’none’

name=’contact’/>

</query>

</iq>

      

              2Jabber用户的客户端接着发送一个type=’subscribe’<presence/>的包给联系人:

                     JABBER USER SENDS:

<presence

to=’contact@host’

type=’subscribe’>

<status>I would like to add you to my roster.</status>

</presence>

 

3Jabber用户客户端接着从服务器收到第二个包含联系人待定子状态的’none’订阅状态的“roster push”;这个待定子状态在其花名册条目中包含一个ask=’subscribe’属性:

                     JABBER USER RECEIVES:

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’contact@host’

subscription=’none’

name=’contact’

ask=’subscribe’/>

</query>

</iq>

 

4、一旦Jabber用户客户端发送type=’subscribe’<presence/>包,该包被发送给联系人(我们假定该联系人在线):

                     CONTACT RECEIVES:

<presence

to=’contact@host’

type=’subscribe’

from=’jabberuser@host’>

<status>I would like to add you to my roster.</status>

</presence>

 

5、  联系人下一步要做的就是决定是否接受订阅请求。这里我们假定为”happy path”,即联系人接受订阅,这样联系人的Jabber客户端:

(1)       发送一个type=’subscribed’<presence/>的包给Jabber用户

(2)       从服务器接收一个“roster push”包含Jabber用户的条目,其中subscription状态置为“from”:

CONTACT SENDS:

<presence to=’jabberuser@host’ type=’subscribed’/>

 

CONTACT RECEIVES:

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’jabberuser@host’

subscription=’from’/>

</query>

</iq>

 

6、  联系人接受订阅请求的结果是:Jabber用户客户端接收到

(1)       一个从联系人发来的type=’subscribed’<presence/>的包

(2)       从服务器发来的一个“roster push”,其中包含一个更新的条目,用来更新联系人的subscription为“to”;

 

JABBER USER RECEIVES:

<presence

to=’jabberuser@host’

type=’subscribed’

from=’contact@host’/>

 

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’contact@host’

subscription=’to’

name=’contact’/>

</query>

</iq>

             

                     现在Jabber用户已经订阅了联系人。每个user.xml的花名册条目将如下所示:

JABBER USER’S ROSTER:

<item

jid=’contact@host’

subscription=’to’

name=’contact’/>

 

           CONTACT’S ROSTER:

<item

jid=’jabberuser@host’

subscription=’from’/>

(注意:如果在这里Jabber用户发送一个subscription请求给联系人,Jabber用户的Jabber服务器将“吞没”该请求,而不再将其发送给联系人。)

4 、从一个联系人获取一个 Subscription

       如我们在前面所见,需要有一个Jabber用户和联系人之间的双向的subscription。在这个过程结束部分,我们将研究Jabber用户与联系人互相订阅的情况。

5 、创建一个相互的 Subscription

       要建立一个相互的Subscription(如 a subscription=’both’),联系必须发送一个subscription请求给Jabber用户,并且Jabber用户必须接受该请求。让我们看看XML传回了什么,弄清楚其中发生了什么,以及每个人的花名册文件发生了什么变化。

1、  首先,联系人发送一个订阅请求给Jabber用户:

CONTACT SENDS:

<presence to=’jabberuser@host’ type=’subscribe’>

                     <status>I would like to add you to my roster.</status>

</presence>

   

2、  联系人客户端从服务器接收到一个“roster push”,其中包含Jabber用户仍然是‘from’的subscription状态,但同时一个待定’to’subscription通过花名册条目中的ask=’subscribe’的属性产生了:

 

CONTACT RECEIVES:

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’jabberuser@host’

subscription=’from’

name=’jabberuser’

ask=’subscribe’/>

</query>

</iq>

 

此行为的一个结果是,联系人和Jabber用户的花名册文件的状态如下所示:

 

CONTACT’S ROSTER:

<item

jid=’jabberuser@host’

subscription=’from’

name=’jabberuser’

ask=’subscribe’/>

 

JABBER USER’S ROSTER:

<item

jid=’contact@host’

subscription=’to’

name=’contact’

subscribe=’I would like to add you to my roster.’/>

 

3、  一旦联系人客户端发送一个包含type=’subscribe’<presence/>包,该包将直接发送给Jabber用户(我们假定此时Jabber用户在线):

 

JABBER USER RECEIVES:

<presence

to=’jabberuser@host’

type=’subscribe’

from=’contact@host’>

<status>I would like to add you to my roster.</status>

</presence>

 

4Jabber用户下一步要做的就是决定是否接受订阅请求。这里我们假定为”happy path”,即联系人接受订阅,这样JabberyonghuJabber客户端:

(1)       发送一个type=’subscribed’<presence/>的包给联系人

(2)       从服务器接收一个“roster push”包含联系人的条目,其中subscription状态置为“both”:

 

JABBER USER SENDS:

<presence to=’contact@host’ type=’subscribed’/>

 

JABBER USER RECEIVES:

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’contact@host’

subscription=’both’/>

</query>

</iq>

 

5Jabber用户接受订阅请求的结果是:联系人客户端接收到

(1)       一个从Jabber用户发来的type=’subscribed’<presence/>的包

(2)       从服务器发来的一个“roster push”,其中包含一个更新的条目,用来更新Jabber用户的subscription为“to”;

 

CONTACT RECEIVES:

<presence

to=’contact@host’

type=’subscribed’

from=’jabberuser@host’/>

 

<iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’jabberuser@host’

subscription=’both’

name=’jabberuser’/>

</query>

</iq>

 

此行为的一个结果是,联系人和Jabber用户的花名册文件的状态如下所示:

       CONTACT’S ROSTER:

<item

jid=’jabberuser@host’

subscription=’both’

name=’jabberuser’/>

 

JABBER USER’S ROSTER:

<item

jid=’contact@host’

subscription=’both’

name=’contact’/>

 

Jabber用户和联系人现在有了一个相互交互的subscription——其subscription的类型为“both”。(注意:如果在这里Jabber用户发送一个subscription请求给联系人,或者联系人发送一个subscription请求给Jabber用户,发送方的Jabber服务器将“吞没”该请求,而不再将其发送给联系人。

6 、取消一个 Subscription
VS Code MCP插件安全审计:五大高危漏洞模式与自动化检测实战 在软件开发中,IDE插件极大地提升了开发效率,但其安全边界往往被忽视。插件通常运行在用户权限下,通过进程间通信与主IDE交互,若设计不当,极易引发权限越界。其核心风险源于对不可信代码执行环境(如沙箱)的隔离不足、对用户输入和外部数据的净化不彻底,以及对底层系统API(如文件系统、进程管理)的过度暴露。这些安全漏洞的技术价值在于,它们揭示了在追求功能开放性与生态繁荣的同时,如何系统性构建安全防线,防止供应链攻击和权限提升。具体到VS Code的Model Context Protocol(MCP)插件,攻击者 阅读详情

相关推荐

ROS fuerte时代rxconsole与roslaunch核心原理深度解析

ROS(Robot Operating System)作为机器人软件开发的核心中间件,其节点通信、参数管理与启动编排机制是理解分布式机器人系统的基础。rxconsole和roslaunch是ROS 1早期版本中实现日志聚合与依赖驱动启动的关键工具,它们揭示了ROS底层基于Master-Client架构、Parameter Server和/rosout话题的协同设计原理。这些机制不仅奠定了ROS 2中rqt_console、ros2 launch等现代工具的技术范式,更在工业遗留系统维护、跨版本迁移及底层调试

weixin_34162228的博客 429

Pulsar Subscriptions(消息订阅)

目录1.订阅(1)订阅类型(2)订阅的模式/游标类型2.多主题订阅订阅是一种配置规则,确定如何将消息传递给使用者。Pulsar有四种订阅类型: exclusive, shared, failover, and key_shared。这些类型的说明如下发布订阅和消息排队在Pulsar中,您可以灵活使用不同的订阅。如果一个订阅没有消费者,那么不会确定订阅类型。订阅的类型在消费者连接到订阅时确定,可以通过使用不同的配置重新启动消费者来更改该类型。独占(Exclusive)在独占类型中,仅允许单个消费者订阅。如果多

swadian2008的博客 4976

简单上手理解Dav框架

官方教程:https://dvajs.com/guide/getting-started.html 一、Model中相关概念的理解 State : 表示 Model 的状态数据,通常表现为一个 javascript 对象。 Action : Action 是一个普通 javascript 对象,它是改变 State 的唯一途径。通过 dispatch 函数调用一个 action,从而改变对应...

qq_32034319的博客 1968

dva中模型中subscriptions的使用

dva中的坑 history 的坑 subscriptions: { setup({dispatch, history}){ history.listen((location) => { const reg = new RegExp(’/pro/(.+)’) const res = reg.exec(location.pathname) if (res && res.leng...

youlinhuanyan的博客 3406

【react框架之dvajs】dva数据流你可能还不知道的subscriptions隐藏的秘密

是一种从 源 获取数据的方法,它来自于 elm。语义是订阅,用于订阅一个数据源,然后根据条件dispatch需要的action。数据源可以是当前的时间、服务器的websocket连接、keyboard 输入、变化、history路由变化等等。简单点说,就是在里面写的方法,在页面一加载的时候就会执行。

峰会路转的博客 425

RabbitMQ集成MQTT注意事项

sessionPresent为true代表代理中已经保存了会话和订阅信息,此时无需重复订阅。发布端使用sessionPresent没有意义,sessionPresent是用于订阅端避免重复订阅的。一个客户端既可以是发布端也可以是订阅端,当客户端没有订阅其他主题时那么sessionPresent永远是false。配置文件中修改配置mqtt.subscription_ttl = undefined。持久化消息存放在硬盘,非持久化消息尽可能的存放在内存中,内存不足时存放到硬盘。重启RabbitMQ服务器

u013626116的博客 295

第12篇-Discord-Slack机器人搭建

《Hermes Agent 协作平台机器人搭建指南》 本文摘要: 本文详细介绍了如何在Discord和Slack平台上配置Hermes Agent机器人。主要内容包括:1)Discord Bot创建步骤,强调必须开启Message Content Intent;2)Slack App配置流程,重点说明权限和事件订阅设置;3)两大平台的功能对比表格;4)多平台同时运行的方法。通过清晰的流程图和操作指引,帮助用户快速在团队协作工具中部署AI助手,实现@提及触发、文件处理等功能。最后提供平台选型建议,满足不同使用

liumingxiy的博客 567

React Hooks学习之路【1】

拖了好久的想学习的心终于到达了极点,对照着中英文档、以及一些优质博客对React Hooks进行学习和延伸。 1. 什么是React Hooks,它解决了什么? React Hooks是16.8的新特性,允许我们不写class组件也可以使用state和其他React特性,hook本质是一个function A Hook is a special function that lets you “h...

眉目成书 918

揭秘Twitch CLI内部工作原理:从代码到实战的深度剖析

Twitch CLI是官方推出的终极开发工具,能让开发者轻松构建Twitch应用。本文将带你探索其内部架构与运行机制,从核心代码到实战应用,全面掌握这个强大工具的工作原理。 ## 一、Twitch CLI的核心架构 ### 1.1 入口文件解析 Twitch CLI的执行入口位于[main.go](https://link.gitcode.com/i/e98c6ac153337579bf13

gitblog_00684的博客 407

关于Dva中subscriptions(订阅)的配置

关于Dva中subscriptions(订阅)的配置 subscriptions:{ HomePage({history,dispatch}){ history.listen(({pathname})=>{ //需要下载一个正则的插件 //cnpm i path-to-regexp -S //正则匹配的是当前路由 const regexp = pathToRegexp(’/home’).test(pathname) if(regexp){ //匹配成功之后可以调用models中的其他函数,可调用多个

Lyq1311484008的博客 846

RabbitMQ MQTT TLS相关配置

RabbitMQ MQTT TLS相关配置 一、启用rabbitmq_mqtt插件及配置 1、启用rabbitmq_mqtt rabbitmq-plugins enable rabbitmq_mqtt 2、用户和身份验证 添加用户:rabb...

SaQiMa1的博客 4998

dva.js subscriptions

subscriptions 第一步 本质上是订阅模式j,订阅或者是监听一个地址(url),如果变化就出发一个dispatch,激活一个type(testPath) 第二步 激活的或者派发的dispatch,testPath方法就会修改state的数据值,也可以在修改数据值前查询当前用户的角色或者权限,然后再经行操作。 ...

zhaojikun521521的博客 623

React中的dav.js脚手架

文章目录安装 dva-cli创建新应用Dav目录使用 antd定义路由 安装 dva-cli 通过 npm 全局安装 dva-cli 并确保版本是 0.9.1 或以上。 npm install dva-cli -g 创建新应用 安装完 dva-cli 之后,就可以在命令行里访问到 dva 命令(不能访问?)。现在,你可以通过 dva new 创建新应用。 dva new dva-app Dav目录 安装完成之后,能看到项目结构 ├── mock // mock数据文件夹 ├── node_mod

Jet_Lover的博客 1418

RabbitMQ配置文件_修改RabbitMQ MQTT的1883端口

Centos离线安装RabbitMQ并开启MQTT Docker安装rabbitMQ RabbitMQ集群搭建和测试总结_亲测 Docker安装RabbitMQ集群_亲测成功 rabbitmq.conf 默认没有配置文件,可以手动创建: /etc/rabbitmq/rabbitmq.conf # ====================================== # RabbitMQ broker section # ======================================

yinjl123456的博客 4882

dva Subscriptions 的使用

dva Subscriptions 的使用history例子socket例子keyboard 输入总结 history例子 subscriptions: { setup({ dispatch, history }) { history.listen(({ pathname }) => { if (pathname === '/users') { ...

王为仁的博客 1万+
上一篇: Jabber学习笔记 之二
下一篇: div 能显示文字的进度条
niitsoftware
博客等级 码龄19年 4粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值