salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
Streaming API参考链接:
https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming
https://resources.docs.salesforce.com/210/latest/en-us/sfdc/pdf/api_streaming.pdf
背景:工作中我们有可能会有这样相关的需求:某些数据很重要,需要实时监控是否有变化,或者某些数据在其他的平台有集成。如果有变化,不刷新页面或者做其他trigger等操作便可以收到相关更改的推送通知(不管是salesforce平台还是其他外部服务,比如java端等,可以通过此种方式进行实时同步),告诉当前的需要监控的记录已经发生了变化。这种场景往往更会出现在数据不止存储在salesforce端,还有其他平台有数据的存储或者访问。这种情况下可以使用Streaming API。
一.Stream API简单介绍
Streaming API提供了两种功能,一种为基于Salesforce数据改变,对订阅的客户端进行通知推送,另一种是不基于Salesforce数据改变,对订阅的客户端进行通知推送,接下来大部分内容基于Salesforce数据改变后,对订阅的客户端进行推送,另外一种感兴趣的可以自行查看。通知推送不止可以应用于salesforce系统,其他系统等也可以通过oauth等连接后接收到通知推送,感兴趣的可以查看API提供的内容。
Streaming API用于制定一套你想要接收的数据的条件,并且指定哪些事件(create/update/delete/undelete)情况下符合的数据推送一条通知到客户端,一条通知就是事件触发的结果发送到渠道的消息。通知的格式为JSON的格式。使用Streaming API可以减少不必要的API请求。
Streaming API使用的推送技术,即服务器端会主动给订阅的客户端发送通知信息,而不是客户端去调用服务器端返回消息,使用Bayeux协议和CometD用于长轮询。
cometd 参考链接: https://docs.cometd.org/
如果想使用Streaming API,需要enable api的权限以及streaming api的权限
想要接受通知(notifications),当前登录的user必须针对StreamingChannel表拥有read权限
想要创建和管理通知,当前登录的user必须对StreamingChannel拥有Create权限
二.Streaming API 使用步骤
针对开发者来说,更关注的是这个东西如何使用。使用Streaming API实现订阅者接收符合条件的推送消息可以三步走:
1.创建PushTopic
去除一下PushTopic神奇的面纱,简单的来说,PushTopic是一个标准的sObject,封装了以下的字段:
- ApiVersion:用于指定查询的SQL的版本,37以后系统可以存储24小时以内的事件,必填字段;
- Description:PushTopic的描述信息,限定在400个字符以内;
- ID:指定一条记录的全局唯一的标识;
- isActive:是否可用,关系到PushTopic的限制计数(系统对PushTopic有limitation size);
- IsDeleted:指定此PushTopic是否移动到回收站;
- Name:PushTopic的名字,定义了渠道的名字,并且此名称必须是唯一的,后期订阅者订阅时,使用的就是这个名字;
- NotifyForFields:指定哪些字段被评估生成通知;
- NotifyForOperations:指定数据哪种事件操作会生成通知,在api version 29以后,此字段为只读字段;
- NotifyForOperationCreate:Create操作是否会生成通知,api29以后可用;
- NotifyForOperationDelete:Delete操作是否会生成通知,api29以后可用;
- NotifyForOperationUndelete:UnDelete操作是否会生成通知,api29以后可用;
- NotifyForOperationUpdate:Update操作是否会生成通知,api29以后可用;
- Query:SOQL语句决定了哪些数据符合触发的事件后会发送到渠道。
恩,新建一个PushTopic,设置了必填字段的值insert以后,一个PushTopic就创建完了。这些字段有几个需要详细的描述一下:
Query:Query在PushTopic的作用不言而喻,定义了哪些数据可以满足条件进行推送。Query语法和SOQL基本相同,但是有一些情况不支持。限制如下:
- select字段无ID;
- 子连接查询Semi-joins and anti-joins;
- 聚合类的查询,比如SUM,AVG等;
- COUNT;
- LIMIT;
- 关系型查询不支持,只可以查询到ID,不能通过“.”的方式查询到父的其他信息;
- 查询中包括Text Area字段;
- ORDER BY;
- GROUP BY;
- WHERE部分使用了formula类型字段;
- NOT Example : SELECT Id FROM Account WHERE NOT Name = 'Salesforce.com'
- OFFSET
- TYPEOF
NotifyForFields:推送的message包含一项sObject字段值的信息,会推送哪些字段值取决于NotifyForFields的赋值,NotifyForFields赋值及作用如下:
- All :推送所有的字段
- Referenced (default) : 推送select以及where部分字段的并集集合,如果不指定此字段值,默认值为Referenced
- Select :只推送select部分的字段;
- Where;只推送where部分的字段。
NotifyForOperationCreate:指定此字段值为true情况下,当操作的sObject进行insert操作,并且满足query的查询条件,则server端会推送一条通知给所有的订阅者们,此字段当且仅当ApiVersion大于29情况下才允许使用;
NotifyForOperationDelete:指定此字段值为true情况下,当操作的sObject进行delete操作,并且满足query的查询条件,则server端会推送一条通知给所有的订阅者们,此字段当且仅当ApiVersion大于29情况下才允许使用;
NotifyForOperationUndelete:指定此字段值为true情况下,当操作的sObject进行undelete操作,并且满足query的查询条件,则server端会推送一条通知给所有的订阅者们,此字段当且仅当ApiVersion大于29情况下才允许使用;
NotifyForOperationUpdate:指定此字段值为true情况下,当操作的sObject进行update操作,并且满足query的查询条件,则server端会推送一条通知给所有的订阅者们,此字段当且仅当ApiVersion大于29情况下才允许使用。
ApiVersion:此字段声明Streaming版本。在36.0及以前,他不包含客户端的状态,也没法跟踪已经过去的事件信息。简单来说,如果声明的版本为36及以前情况下,客户端订阅了渠道后,只能收到订阅后的满足条件的数据事件发生的数据,订阅以前的相关满足事件的数据便没法接收到。如果将此字段设置值为37.0及以上,Streaming API支持存储24小时内满足条件的数据通知信息,即使客户端订阅渠道后,也可以重播24小时内的以前的数据。一条记录有可能出现增删改等很多的事件,每一个广播事件通过replayId作为编号,replayId在org和渠道中是唯一的,即使事件被删除后,此事件对应的replayId也不会被重用,订阅者可以通过赋值ReplayId接收不同的事件消息进行重播,主要有三种ReplayId 赋值
-2:订阅者连接渠道后,接收所有的事件,包括订阅时前24小时的事件消息;
-1:订阅者连接渠道后,接收订阅以后的事件消息;
replayId:订阅者连接渠道后,接受指定replayId以及以后的事件消息,比如replayId为5,订阅者将会受到5以后的事件消息。
(注:每个Query语句中只能搜索一个sObject.)
当新建PushTopic想要查看是否创建成功以及是否生效,或者模拟PushTopic的订阅,可以使用workbench查看相关的状态,这里以Account为例,监听Account增删改事件,有以上事件则会发送通知。
1)登录workbench,网址https://workbench.developerforce.com/login.php,选择登录的版本为36.0
2)Jump To选择Streaming Push Topics
3)Push Topics 选择刚刚创建的TestAccountStreaming,点击Subscribe,则目前已经模拟订阅了此PushTopic
4)修改了一条Account信息,则会在Streaming Push Topic 显示具体的修改信息推送消息了。
PushTopic按照上面的字段描述可以很轻松的创建了,下一步应该是让客户端来订阅。如何让订阅呢,这时,我们需要定义一个渠道,保证客户端可以顺利订阅此渠道(Channel),当有满足条件事件的数据进行触发后,由渠道server主动推送给订阅此渠道的客户端。渠道在salesforce端也封装成了一个对象 StreamingChannel,
StreamingChannel表结构如下:
- Description : Streaming Channel的描述
- ID : Streaming Channel的ID
- IsDeleted : 指定Streaming Channel是否被移动到回收站
- IsDynamic : 如果为true则在订阅时动态创建channel
- LastReferencedDate : 存储当前用户最近一次查看的这条记录的时间戳
- Name:绑定的PushTopic,以/u/开始,命名为/u/pushtopic Name
- OwnerId : Streaming Channel的owner
这里主要需要说明的一个字段就是Name,Name字段要求必须为/u/PushTopicName,并且PushTopicName只能包含标准的字符以及‘_’或者‘/’,其他的字符不支持,比如上面创建的PushTopic的名称为TestAccountPushTopic,则创建StreamingChannel时,Name必须为/u/TestAccountPushTopic,并且区分大小写。
2.客户端订阅渠道
客户端订阅渠道可以简单的分成三部分:
- 发送一个握手请求
- 向渠道发送一个订阅的请求
- 使用长响应(轮询)进行连接。
如果订阅是在页面或者组件中使用,可以使用Cometd进行操作,Cometd提供了基本方法用来实现客户端订阅操作,详见Cometd API。当渠道成功后,PushTopic定义的query的数据执行的操作事件(create/update/delete/undelete)满足了PushTopic定义的操作条件,渠道将会向所有订阅的客户端发送通知。上面说道,通知是一个JSON的字符串,大概格式如下所示:
{
"clientId": "lxdl9o32njygi1gj47kgfaga4k",
"data": {
"event": {
"createdDate": "2016-09-16T19:45:27.454Z",
"replayId": 1,
"type": "created"
},
"sobject": {
"Phone": "(415) 555-1212",
"Id": "001D000000KneakIAB",
"Name": "Blackbeard"
}
},
"channel": "/topic/AccountUpdates"
}
订阅者订阅接收消息需要有以下的权限:
where条件部分的字段的FLS
query对象的读的权限
PushTopic对象的读的权限
基于Sharing Rule的新建和编辑记录的权限
Salesforce存储了基于PushTopic时间24小时,并且允许你去重新检索已经存储的以及新的事件。订阅者可以通过重播的选项来选择哪些事件接收。
当你订阅一个渠道后,你并不想接收所有的数据,比如对于客户信息,不同的人员更关注自己的客户的变化信息,这是你可以在订阅的URL后添加filter对事件通知进行过滤,推送你需要的通知信息。
eg:/topic/ChannelName?<expression>
其中ChannelName为上面定义的渠道的名称,<expression>包含一个或者多个条件,多个条件使用'&'分割,比如
/topic/TestAccountPushTopic?country=China&isActive=true
如果使用ID作为过滤条件,需要使用18位的ID格式,15位的不支持。
三.代码举例
官方提供了两个demo,一个是基于数据进行DML操作发送给订阅者消息,一个是主动广播发送给订阅者消息。
https://github.com/developerforce/SalesforceDurableStreamingDemo/archive/master.zip
可以下载下来看一下代码,代码里面详尽的讲解了客户端握手,订阅以及接受信息的操作。
总结:本篇主要简单讲解Streaming API的使用方式以及什么情况下会使用到此API,如果使用到查看上面的文档即可。
salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)的更多相关文章
- salesforce零基础学习(九十五)lightning out
随着salesforce对lightning的推进,越来越多的项目基于lightning开发,导致很多小伙伴可能都并不了解classic或者认为不需要用到classic直接就开始了lightning的 ...
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce 零基础学习(四十七) 数据加密简单介绍
对于一个项目来说,除了稳定性以及健壮性以外,还需要有较好的安全性,此篇博客简单描述salesforce中关于安全性的一点小知识,特别感谢公司中的nate大神和鹏哥让我学到了新得知识. 项目简单背景: ...
- salesforce零基础学习(一百零五)Change Data Capture
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...
- salesforce零基础学习(九十六)Platform Event浅谈
本篇参考:https://developer.salesforce.com/blogs/2018/07/which-streaming-event-do-i-use.html https://trai ...
- salesforce零基础学习(一百一十)list button实现的一些有趣事情
本篇参考: salesforce零基础学习(九十五)lightning out https://developer.salesforce.com/docs/component-library/docu ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
随机推荐
- vue2.0 微信oauth认证的正确调用位置
运行在微信端的项目,很重要的环节是oauth认证:那在vue项目中,在何时何地调用oauth认证最合适呢? 经过观察,在项目启动过程中,会执行main.js文件:所以我将认证放在main.js中操作: ...
- C盘里的桌面文件移到E盘里了,然后E盘里的文件都显示到桌面上了,怎么将桌面文件还原回C盘
1 . 直接按Windows键+R,打开"运行"对话框,在输入框中输入"regedit"命令,会打开注册表编辑窗口: 2.打开注册表文件将HKEY_CURREN ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)
在阿里云 ECS 搭建 nginx https nodejs 环境(二) 这次主要内容是 如何在 ubuntu 的nginx 下配置 二级域名. 一. 域名解析 首先你需要去到你的 域名服务商那边 进 ...
- C语言中处理结构体的原理
汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...
- 初学Vue之数量加减
效果图: HTML: <div class="count3"> <ul> <li v-for="(key,idx) in liList&qu ...
- git向码云上传代码总结
1.下载git windows下载地址:https://git-for-windows.github.io/ 2.安装git 一路确定 3.配置git 如果你要使用ssh上传代码,你需要本地生成ssh ...
- 简单的ajax遮罩层(加载进度圈)cvi_busy_lib.js
cvi_busy_lib.js cvi_busy_lib.js 是一个基于ajax的遮罩js,遮罩区域为body区域.使用比较简单. 效果: 在下面的Js代码,标注为红色标记为需要设置的参数. 1.g ...
- java字符串比较
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在j ...
- git客户端安装后,访问不到gitsever解决办法
1,运行 git Bash 客户端 $ cd ~/.ssh 如果没有此目录则创建一个 $ mkdir ~/.ssh 2,在.ssh目录下 $ ssh-keygen -t rsa -C "你的 ...
- python抢火车票的脚本
起因: 想着那么多人,抢不到火车票.感觉到一丝感慨 所以有了抢火车票这个脚本. 0x01 思路:自动打开浏览器,自动输入账号密码 知道查看.自动预定. 0x02 要用到的模块 splinter模块: ...