使用 empApi 组件实现 Change Data Capture 功能
Change Data Capture 功能是从 Winter ’19 版本开始正式启用的功能。
它是基于“发布-订阅”模式设计,可以将 Salesforce 中记录的改变自动推送给订阅者所在的系统,比如 Salesforce 内部的功能模块或外部的数据库。
在 Lightning 框架中,lightning:empApi 组件可以实现“订阅者”的角色。在本文中,我们将演示如何使用 lightning:empApi 组件来实时得到记录的更新信息。
启用 Change Data Capture 功能
Change Data Capture 功能是基于对象的,所以我们首先要设置想要订阅的对象类型。
在“设置”界面中搜索“更改数据捕获”,可以进入 Change Data Capture 的设置界面。我们可以设定哪些对象的更新会被记录。

建立 Lightning 组件
新建 Lightning 组件,命名为 CDCDemo.cmp,代码如下:
<aura:component implements="flexipage:availableForRecordHome,force:hasRecordId,force:hasSObjectName">
<aura:attribute name="recordId" type="String" />
<aura:attribute name="sObjectName" type="String" />
<aura:attribute name="changeList" type="Object[]" description="存储更新信息,显示在用户界面中" />
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
<lightning:empApi aura:id="empApi"/>
<lightning:card footer="" title="更新记录">
<aura:iteration items="{!v.changeList}" var="item">
<p class="slds-p-horizontal_large">
<a href="#"><span onclick="{!c.gotoUser}" data-user-id="{!item.userId}">用户</span></a>于 {!item.modifiedDate} 更新了此记录。
</p>
</aura:iteration>
</lightning:card>
</aura:component>
其 JavaScript 控制器代码如下:
({
doInit : function(component, event, helper) {
var empApi = component.find("empApi");
// 设定 channel 值。Change Data Capture 功能使用 channel 值来追踪数据更新
var channel = '/data/';
// 得到 SObject 对象类型,从而补全 channel 值。标准对象和自定义对象的 channel 值构建方法不同
var sObjectName = component.get('v.sObjectName');
if (sObjectName.endsWith('__c')) {
channel = channel + sObjectName.substring('0', sObjectName.length - 3) + '__ChangeEvent';
} else {
channel = channel + sObjectName + 'ChangeEvent';
}
// 设定 replayId 为-1,表示得到最新的更新事件
var replayId = '-1';
// 设定数据改变之后的 callback 逻辑,message 中包含了数据更新的详细信息
var callback = function (message) {
var modifiedRecords = message.data.payload.ChangeEventHeader.recordIds; // 得到更新的数据的 Id 值
var commitUser = message.data.payload.ChangeEventHeader.commitUser; // 得到进行更新的用户的 Id 值
var currentRecordId = component.get('v.recordId');
var userId = $A.get("$SObjectType.CurrentUser.Id");
// 如果当前记录被更改,并且更改的用户不是当前用户,则将更改的信息放入 changeList 属性中,显示在用户界面上
if (modifiedRecords.includes(currentRecordId) && commitUser != userId) {
var changeList = component.get('v.changeList');
var changeItem = {};
changeItem.userId = commitUser;
var modifiedDate = new Date(message.data.payload.LastModifiedDate);
changeItem.modifiedDate = modifiedDate.toString();
changeList.push(changeItem);
component.set('v.changeList', changeList);
}
}.bind(this);
// 开始订阅
empApi.subscribe(channel, replayId, callback).then(function(value) {
// 订阅成功,可以在这里显示成功信息
});
// 错误处理
var errorHandler = function (message) {
// 显示错误信息
}.bind(this);
// 将错误处理函数连接到 empApi 组件中
empApi.onError(errorHandler);
},
gotoUser : function(component, event, helper) {
var userId = event.currentTarget.dataset.userId;
// 重定向到用户界面
var navEvt = $A.get("e.force:navigateToSObject");
navEvt.setParams({
"recordId": userId
});
navEvt.fire();
},
})
在“客户”页面上使用组件
在“客户”的页面上,进入“编辑页面”界面。然后,将刚才建立的 CDCDemo 组件拖动到页面的“活动”部分。

然后,如果在我们浏览“客户”记录页面的同时,其他用户修改了此条记录,在“活动”部分会动态地给出通知。

小结
在这个示例中,我们主要使用了 Lightning 中的 empApi 组件来动态订阅数据的更新,然后自动推送到用户界面中。
使用其他的工具(比如 Salesforce 推荐的 EMP-Connector)可以将数据的订阅推送到其他的系统中,实现系统的整合和同步。
使用 empApi 组件实现 Change Data Capture 功能的更多相关文章
- SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑
SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC 原文:http://www.cnblogs.com/chenxizhang/arc ...
- SQL Server审计功能入门:CDC(Change Data Capture)
原文:SQL Server审计功能入门:CDC(Change Data Capture) 介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. ...
- SSIS CDC(Change Data Capture)组件在数据库中启用报错。 The error returned was 14234: 'The specified '@server' is invalid
昨天实验CDC,在数据库中执行以下语句的时候出错. EXEC sys.sp_cdc_enable_table @source_schema = N'stg', @source_name = N'CDC ...
- ELT工具Kettle之CDC(Change Data Capture)实现实例
ETL过程的第一步就是从不同的数据源抽取数据并把数据存储在数据的缓存区.这个过程的主要挑战就是初始加载数据量大和比较慢的网络延迟.在初始加载完成之后,不能再把所有数据重新加载一遍,我们需要的只是变化的 ...
- Oracle CDC (Change Data Capture)更新数据捕获——概述
Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...
- salesforce零基础学习(一百零五)Change Data Capture
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...
- Oracle CDC (Change Data Capture)更新数据捕获——Asynchronous HotLog Mode(附带简单的kettle任务实现数据同步)
Performing Asynchronous HotLog Publishing Step 1 Source Database DBA: Set the database initializat ...
- SqlServer Change Data Capture(CDC)数据变更捕获
最近在使用SqlServer2008r2数据库做系统的时候,在某些重要的.经常涉及到修改的表上,想加上一些恢复机制,一开始想找找看看有没有类似Oracle数据库闪回那样的功能,后来发现CDC的功能可以 ...
- SQL数据同步到ELK(四)- 利用SQL SERVER Track Data相关功能同步数据(上)
一.相关文档 老规矩,为了避免我的解释误导大家,请大家务必通过官网了解一波SQL SERVER的相关功能. 文档地址: 整体介绍文档:https://docs.microsoft.com/en-us/ ...
随机推荐
- 深入理解Spring Redis的使用 (四)、RedisTemplate执行Redis脚本
对于Redis脚本使用过的同学都知道,这个主要是为了防止竞态条件而用的.因为脚本是顺序执行的.(不用担心效率问题)比如我在工作用,用来设置考试最高分. 如果还没有用过的话,先去看Redis脚本的介绍, ...
- Python函数声明以及与其他编程语言数据类型的比较
1.函数声明 与其它大多数语言一样 Python 有函数,但是它没有像 C++ 一样的独立的头文件:或者像 Pascal 一样的分离的 interface / implementation 段.在需 ...
- [Swift]LeetCode320. 通用简写 $ Generalized Abbreviation
Write a function to generate the generalized abbreviations of a word. Example: Given word = "wo ...
- C++ 动态生成对象
1.啰嗦一下 说起C++,很多人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西 ...
- qt实现头像上传功能
想必大家都使用过qt的自定义头像功能吧,那么图1应该不会陌生,本片文章我就是要模拟一个这样的功能,虽然没有这么强大的效果,但是能够满足一定的需求. 图1 qq上传图片 首先在讲解功能之前,我先给出一片 ...
- redis 系列20 服务器下
二. serverCron函数 2.3 更新服务器每秒执行命令次数 serverCron函数中的trackOperationsPerSecond函数会以每100毫秒一次的频率执行,这个函数以抽样计算的 ...
- java~@Async异步功能
@Async注解,可以实现异步处理的功能,它可以有返回值,或者直接在新线程时并行执行一个任务,对于异步来说,它的执行是有条件的,你需要把异步代码块放在单独的类里,当spring在注入时,才不会相互影响 ...
- Docker折腾手记-安装
安装 docker红的发紫,所以博主耳闻这么久,也要来折腾折腾了 研究不多,个人目前认为docker给我们带来了以下好处 开发机器因为开发原因,需要配置各种各校的环境,繁琐且耗费资源.配来配去还容易环 ...
- 基于N-Gram判断句子是否通顺
完整代码实现及训练与测试数据:click me 一.任务描述 自然语言通顺与否的判定,即给定一个句子,要求判定所给的句子是否通顺. 二.问题探索与分析 拿到这个问题便开 ...
- 谈谈.NET Core中基于Generic Host来实现后台任务
目录 前言 什么是Generic Host 后台任务示例 控制台形式 消费MQ消息的后台任务 Web形式 部署 IHostedService和BackgroundService的区别 IHostBui ...