Apex-事件驱动(3)

学习目标

完成本单元后,您将能够:

  • 描述如何订阅平台事件消息。
  • 使用Apex触发器订阅事件。
  • 用Apex测试方法测试平台事件。
  • 通过CometD订阅平台事件。

订阅平台事件

现在您已经看到了如何发布平台事件,您如何订阅他们以获得最新消息或发货的通知?在Salesforce平台上,Apex触发器,流程和流程接收事件通知。 Visualforce和Lightning组件应用程序通过CometD接收事件。在外部应用程序中,您也可以使用CometD订阅事件。

使用Apex触发器订阅平台事件通知

您可能以前使用过Apex触发器,以基于数据库事件执行操作。通过平台事件,过程是相似的。您只需在事件对象上插入一个插入Apex触发器来订阅传入事件即可。触发器在Apex中提供自动订阅机制。不需要明确创建和收听频道。触发器接收来自各种来源的事件通知,不管它们是通过Apex还是API发布的。

平台事件仅在插入触发器后才支持。后插入触发器事件对应于发布平台事件之后的时间。事件消息发布后,触发后插入触发器。

要创建平台事件触发器,请使用开发者控制台。

  1. 单击设置图标,选择 Developer Console, 然后单击 File | New | Apex Trigger.
  2. 提供一个名称并为sObject选择事件,然后单击 Submit.

开发者控制台会自动在触发器模板中添加after插入事件。另外,您可以方便地从“触发器”相关列表中的“设置”中的事件定义页面创建触发器,但是必须指定after insert关键字。

以下示例显示了Cloud News事件的触发器。它遍历每个事件并通过Urgent__c字段检查消息是否紧急。如果消息紧急,则触发器创建一个派发新闻记者的案例,并将事件位置添加到案例主题。

// 触发Cloud_News事件。
trigger CloudNewsTrigger on Cloud_News__e (after insert) {    
    // 列举所有要创建的案例。
    List<Case> cases = new List<Case>();
    
    // 获取案例所有者的队列ID
    Group queue = [SELECT Id FROM Group WHERE Name='Regional Dispatch' LIMIT 1];
       
    // 遍历每个通知
    for (Cloud_News__e event : Trigger.New) {
        if (event.Urgent__c == true) {
            // Create Case to dispatch new team.
            Case cs = new Case();
            cs.Priority = 'High';
            cs.Subject = 'News team dispatch to ' + 
                event.Location__c;
            cs.OwnerId = queue.Id;
            cases.add(cs);
        }
   }
    
    // 插入与收到的事件相对应的所有案例。
    insert cases;
}
设置调试日志记录

与标准或自定义对象上的触发器不同,平台事件上的触发器不会在与发布事件相同的Apex事务中执行。触发器在系统用户Automated Process实体下的自己的进程中运行。因此,与触发器执行相对应的调试日志由Automated Process实体创建,并且在Developer Console中不可用。要收集平台事件触发器日志,请在“安装”中为“自动过程”实体添加跟踪标志条目。

  1. 在安装程序中,在快速查找框中输入调试日志,然后单击 Debug Logs.
  2. 点击 New.
  3. 对于跟踪的实体类型,请选择 Automated Process.
  4. 选择您要收集的日志的开始日期和到期日期。
  5. 对于调试级别,输入*然后单击 Search.
  6. 选择一个预定义的调试级别,例如SFDC_DevConsole或单击New来创建您自己的调试级别。
  7. 点击 Save.

注意

Apex测试的调试日志是一个例外。它们包括在同一个测试执行日志中记录事件触发器。

有关平台事件触发器的注意事项

事件处理的顺序
触发器按收到的顺序处理平台事件通知。事件的顺序基于事件重播ID。 Apex触发器可以一次接收一批事件。事件的顺序保存在每个批次中。批处理中的事件可以来自一个或多个发布者。
异步触发器执行
平台事件触发器异步运行在其自己的进程中,不是发布事件的事务的一部分。因此,事件发布时间和触发器处理事件之间可能存在延迟。不要期望触发器执行的结果在事件发布之后立即可用。
自动化的过程系统用户
由于平台事件触发器不会在执行它们的用户(正在运行的用户)下运行,而是在Automated Process系统用户下运行,所以我们在CloudNewsTrigger示例中明确地设置了所有者ID字段。我们使用了一个称为Regional Dispatch的示例用户队列的ID作为触发器示例。如果您在触发器(例如案例或商机)中创建带有OwnerId字段的Salesforce记录,请明确设置所有者ID。对于案例和潜在客户,您可以使用分配规则来设置所有者。
此外,系统字段(例如CreatedById和LastModifiedById)引用自动处理实体,而不是正在运行的用户。
Apex Governor 限制
与标准或自定义对象触发器一样,平台事件触发器也受到Apex控制器限制。
Apex Trigger 限制
平台事件触发器共享许多自定义和标准对象触发器的相同限制。例如,您不能从触发器中同步创建Apex标注。

订阅事件定义页面上的相关列表

您可以在安装程序的“平台事件定义详细信息”页面上查看所有事件触发器的状态。 CometD用户不在此列表中。在订阅下,每个激活的触发器都与执行信息和状态一起列出。信息包括上次发布和上次处理事件的重播ID。由于错误不可恢复或权限不足,状态会指示触发器是否正在运行或已与订阅断开连接。仅当触发器重试次数达到最大次数时,才会达到错误状态。以下屏幕截图显示了“云新闻”事件详细信息页面上的“订阅”相关列表。

Subscriptions related list shows the state of subscribed triggers

测试平台事件触发器

通过添加Apex测试,确保您的平台事件触发器正常工作。在将任何Apex代码(包括触发器)打包或部署到生产之前,您的Apex代码必须进行测试。要在Apex测试中发布平台事件,请将发布语句放在Test.startTest和Test.stopTest语句中。

// 创建测试事件
Test.startTest();
// 发布事件
Test.stopTest();
// 在这里执行验证
在测试上下文中,发布方法调用将发布操作排队。 Test.stopTest()语句导致事件发布被执行。 Test.stopTest()后,执行您的验证。

以下是我们的Cloud_News事件及其相关触发器的测试类示例。发布事件会导致关联的触发器触发。在Test.stopTest()之后,测试通过检查Database.SaveResult中的isSuccess()返回的值来验证发布是否成功。另外,测试查询触发器创建的情况。如果找到案例记录,则触发器成功执行,并通过测试。

@isTest
public class PlatformEventTest {
    @isTest static void test1() {
        // 创建测试事件实例
        Cloud_News__e newsEvent = new Cloud_News__e(
            Location__c='Mountain City', 
            Urgent__c=true, 
            News_Content__c='Test message.');
        
        Test.startTest();

        // 调用方法来发布事件
        Database.SaveResult sr = EventBus.publish(newsEvent);
        
        Test.stopTest();
        
        // 在这里执行验证

        // 验证发布是否成功
        System.assertEquals(true, sr.isSuccess());

        // 检查创建的触发器是否存在。
        List<Case> cases = [SELECT Id FROM Case];
        // 验证是否发现此案例。
        // 在测试上下文中只有一个测试用例。
        System.assertEquals(1, cases.size());
    }
}

使用点击订阅平台事件通知

要订阅没有代码的事件消息,请创建一个在发生平台事件时启动的进程。

此屏幕截图显示了一个进程在发生Cloud News事件时开始。当它开始时,该过程查找邮件城市匹配事件通知位置的联系人记录。

Process Builder matching criteria screen

同样,您可以通过使用Wait元素来订阅具有流程的平台事件消息。当发生平台事件时,不是启动流程,而是先前启动的流程等待平台事件,然后恢复。例如,以下是等待Cloud News事件消息发生的Wait元素。只有当事件的位置匹配{!MailingCity_Location.MailingCity}时才会继续。 {!MailingCity_Location}是流中的一个sObject变量。

Cloud Flow Designer Wait element

使用CometD订阅平台事件通知

外部应用程序使用CometD订阅平台事件并执行长时间轮询。平台应用程序(如Visualforce页面和Lightning组件)也可以使用CometD。 CometD是一个可扩展的基于HTTP的事件路由总线,它使用了一种名为Comet的AJAX推送技术模式。它实现了Bayeux协议。长轮询(也称为Comet编程)允许模拟从服务器到客户端的信息推送。与普通轮询类似,客户端连接并请求来自服务器的信息。但是,如果信息不可用,服务器不会发送空的响应,而是等待信息可用(发生事件)。

Salesforce提供了一个Java库EMP连接器,该连接器实现了连接到CometD和监听通道的所有细节。您可以使用EMP Connector轻松订阅平台事件。 EMP连接器隐藏了订阅事件的复杂性。有关EMP Connector的更多信息,请查看Streaming API开发人员指南中的Java客户端示例。

通过CometD订阅平台事件通知的过程与订阅PushTopic事件或通用事件类似。唯一的区别是频道名称。以下是平台事件主题(频道)名称的格式:

/event/<EventName>__e
例如,如果您有名为“云新闻”的平台事件,请在订阅时提供此频道名称。
/event/Cloud_News__e
在CometD URL末尾指定API版本,如下所示。
// 连接到CometD端点
    cometd.configure({
               url: 'https://<Salesforce_URL>/cometd/41.0/',
               requestHeaders: { Authorization: 'OAuth <Session_ID>'}
    });

JSON格式的平台事件消息

交付平台事件的消息与Cloud News事件的以下示例类似。

{
  "data": {
    "schema": "_2DBiqh-utQNAjUH78FdbQ", 
    "payload": {
      "CreatedDate": "2017-04-27T16:50:40Z", 
      "CreatedById": "005D0000001cSZs", 
      "Location__c": "San Francisco", 
      "Urgent__c": true, 
      "News_Content__c": "Large highway is closed due to asteroid collision."
    }, 
    "event": {
      "replayId": 2
    }
  }, 
  "channel": "/event/Cloud_News__e"
}

事件消息中的模式字段包含平台事件模式的标识(在本例中为“schema”:“_2DBiqh-utQNAjUH78FdbQ”)。模式是版本化的 – 当模式改变时,模式ID也改变。

要确定事件的模式是否已更改,请通过REST API检索模式。通过对此REST API资源执行GET请求来使用模式标识:/vXX.X/event/eventSchema/Schema_ID。或者,您可以通过将事件名称提供给此端点来检索事件模式:/vXX.X/sobjects/Platform_Event_Name__e/eventSchema。有关更多信息,请参阅Force.com REST API开发人员指南。

注意

与PushTopic和泛型事件不同,平台事件不支持使用过滤的订阅。例如,订阅/事件/ Cloud_News__e?Location__c =’旧金山’按位置过滤不受支持。

现在您已经看到了如何在Salesforce平台和外部应用程序中使用平台事件,这种可能性是无止境的!将平台事件用于任何数量的应用程序和集成,例如处理业务交易或参与主动客户服务。借助平台事件,您可以采用基于事件的编程模式,并享受基于事件的软件架构的优势。

Apex-事件驱动(2)

学习目标

完成本单元后,您将能够:

  • 定义一个平台事件。
  • 描述如何发布平台事件消息。
  • 使用Apex方法发布一个事件。
  • 通过插入一个sObject来发布一个使用REST API的事件。

定义和发布平台事件

现在,您已经了解了平台事件以及何时使用了平台事件,接下来我们将介绍如何定义平台事件。还记得云端通讯社吗?我们来创建一个平台事件定义来保存新闻事件的数据。

定义一个名为Cloud News的平台事件:

  1. 从安装程序中,在快速查找框中输入平台事件,然后选择 Platform Events.
  2. 在“平台事件”页面上,单击 New Platform Event.
  3. 对于标签,请输入 Cloud News.
  4. 对于多标签,请输入 Cloud News.
  5. 对于描述,输入 Cloud news events deliver news at your fingertips.
  6. 点击 Save.
  7. 在“自定义字段和关系”相关列表中,单击 New.
  8. 选择 Text, 然后单击 Next.
  9. 对于字段标签/名称,输入 Location.
  10. 对于“长度”,请键入100.保留其他字段的默认值,并将“说明”字段保留为空。点击 Save.
  11. 按照步骤7,8和9添加下两个字段:
    字段标签/名称 字段类型
    Urgent Checkbox
    News Content Text Area (Long)

对于您刚定义的Cloud News事件,您创建了各种类型的字段,如文本字段或复选框。平台事件支持的所有字段类型是:

  • Checkbox
  • Date
  • Date/Time
  • Number
  • Text
  • Text Area (Long)

事件保留和ReplayId系统字段

Salesforce将平台事件存储24小时。您可以检索API CometD客户端中存储的事件,但不能检索Apex中的事件。您可以检索所有存储的事件,也可以将事件的重播ID指定为检索事件的基线。

即使Salesforce暂时保留事件记录,也不能通过SOQL或SOSL查询它们。同样,您不能在报告,列表视图和搜索中的用户界面中使用事件记录。只有在订购CometD和使用ReplayId选项时才能检索过去的事件。我们向您展示如何订阅下一单元的活动。

每个事件消息被分配一个包含在ReplayId字段中的不透明ID。由系统填充的ReplayId字段值指的是事件流中事件的位置。重放ID值不保证连续事件连续。例如,ID为999的事件之后的事件可以具有1,025的ID。订阅者可以存储重播ID值并在重新订阅时使用它来检索保留窗口内的事件。例如,用户可以在连接失败后检索错过的事件。订阅者不得根据存储的重播ID来计算新的重播ID,以引用流中的其他事件。

API名称后缀

在创建平台事件时,系统会附加__e后缀来创建事件的API名称。例如,对于Cloud News事件,API名称是Cloud_News__e。只要以编程方式引用该事件,请使用API​​名称,例如,在Apex,REST API和Enterprise API中。

发布事件

如果您的应用程序位于Salesforce平台上,则可以使用Apex方法或声明性工具(如Process Builder或Cloud Flow Designer)发布事件。如果您的应用是外部应用,则可以使用Salesforce API发布事件。

使用Apex发布事件消息

要发布事件消息,请创建事件的实例并将其传递给EventBus.publish方法。

以下示例创建一个类型为Cloud_News__e的事件,将其发布,然后检查发布是成功还是遇到错误。 EventBus.publish()方法返回一个Database.SaveResult对象,其中包含发布的结果。如果isSuccess()返回true,则事件已在Salesforce事件总线中发布。否则,该事件遇到在Database.Error对象中返回的错误。

// 创建一个事件的实例并将其存储在newsEvent变量中
Cloud_News__e newsEvent = new Cloud_News__e(
           Location__c='Mountain City', 
           Urgent__c=true, 
           News_Content__c='Lake Road is closed due to mudslides.');

// 调用方法来发布事件
Database.SaveResult sr = EventBus.publish(newsEvent);

// 检查发布结果
if (sr.isSuccess()) {
    System.debug('Successfully published event.');
} else {
    for(Database.Error err : sr.getErrors()) {
        System.debug('Error returned: ' +
                     err.getStatusCode() +
                     ' - ' +
                     err.getMessage());
    }
}
要在同一个调用中发布多个事件,请将您的事件添加到事件列表中,然后将该列表传递给EventBus.publish()方法。此方法的输出是Database.SaveResult对象的数组:每个发布的事件一个。 EventBus.publish()可以发布一些传入事件,即使由于错误而无法发布其他事件。 EventBus.publish()方法不会因发布操作失败而引发异常。在使用部分成功选项调用时,它的行为类似于Apex Database.insert()方法。
// List来保存要发布的事件对象。
List<Cloud_News__e> newsEventList = new List<Cloud_News__e>();
// 创建事件对象
Cloud_News__e newsEvent1 = new Cloud_News__e(
           Location__c='Mountain City', 
           Urgent__c=true, 
           News_Content__c='Lake Road is closed due to mudslides.');
Cloud_News__e newsEvent2 = new Cloud_News__e(
           Location__c='Mountain City', 
           Urgent__c=false, 
           News_Content__c='Small incident on Goat Lane causing traffic.');
// 将事件对象添加到列表中。
newsEventList.add(newsEvent1);
newsEventList.add(newsEvent2);

// 调用方法来发布事件。
List<Database.SaveResult> results = EventBus.publish(newsEventList);

// 检查每个事件的发布结果
for (Database.SaveResult sr : results) {
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                        err.getStatusCode() +
                        ' - ' +
                        err.getMessage());
        }
    }       
}

注意

Salesforce平台对您可以在组织中定义的事件数量以及您可以在一个小时内发布的事件记录数量进行限制。此外,由于事件发布相当于DML插入操作,所以适用DML限制和其他Apex调控限制。有关平台事件限制和Apex调控器限制的更多信息,请参阅参考资料部分。

使用点击发布事件消息

要发布没有代码的事件消息,请在流程或流程中使用记录创建功能。

此屏幕截图显示了在发布Cloud News事件消息的Process Builder中创建记录操作的示例。基本上,将“记录类型”设置为要发布的平台事件(云新闻),然后设置事件的值。

The Create a Record action in Process Builder is set to the Cloud News record type. The fields of the Cloud News event are filled.

同样,您可以使用流发布平台事件消息。配置Record Create元素以创建平台事件(Cloud_News__c)的实例,然后设置事件的值。要设置布尔字段的值(如Urgent__c),请使用{!$ GlobalConstant.True}。

使用Salesforce API发布事件消息

外部应用使用API​​发布平台事件消息。您可以像插入sObjects一样创建事件记录来发布事件。您可以使用Salesforce API来创建平台事件记录,如SOAP API,REST API或Bulk API。

例如,对于Cloud News事件,您可以通过插入Cloud_News__e记录来发布事件通知。以下示例在REST API中创建一个类型为Cloud_News__e的事件。

sObject REST端点:

/services/data/v40.0/sobjects/Cloud_News__e/
POST请求的请求主体:
{
   "Location__c" : "Mountain City",
   "Urgent__c" : true,
   "News_Content__c" : "Lake Road is closed due to mudslides."
}
平台事件记录创建后,REST响应看起来像这个输出。为了简洁,标题被删除。
HTTP/1.1 201 Created 

{   
   "id" : "e00xx000000000B",
   "success" : true,
   "errors" : [ ],
   "warnings" : [ ] 
}
您可以使用任何REST API工具或HTTP客户端应用程序来进行REST API调用。例如,您可以按照以下步骤使用Workbench。
  1. 登录到您的Trailhead DE组织。
  2. 打开一个新标签页并导航到Workbench https://workbench.developerforce.com/login.php
  3. 对于环境,请选择 Production.
  4. 对于API版本,请选择可用的最高编号。
  5. 选择 I agree to the terms of service.
  6. 点击 Login with Salesforce.
  7. 在下一个屏幕上,单击 Allow.
  8. 在顶部菜单中,选择 utilities | REST Explorer.
  9. 点击 POST.
  10. 将URI替换为:
    /services/data/v40.0/sobjects/Cloud_News__e
  11. 对于请求正文,以JSON格式添加以下正文。
    {
       "Location__c" : "Mountain City",
       "Urgent__c" : true,
       "News_Content__c" : "Lake Road is closed due to mudslides."
    }
  12. 点击 Execute.

    Salesforce在发布事件后返回的响应类似于以下内容。

    {
      "id" : "e00xx0000000001AAA",
      "success" : true,
      "errors" : [ ],
      "warnings" : [ ]
    }
    
    或者,您可以通过create()调用或在Bulk API中使用批处理作业在SOAP API中发布事件。

平台事件和事务

与自定义对象不同,平台事件不在Salesforce平台的数据库事务中处理。 因此,发布的平台事件无法回滚。 请注意以下几点:

  • 当您通过API发布平台事件时,allOrNoneHeader API标头将被忽略。
  • 平台事件不支持Apex setSavepoint()和rollback()数据库方法。

当您发布平台事件时,适用DML限制和其他Apex调控限制。

现在你已经看到了如何定义和发布事件,让我们看看如何订阅它们!

Apex-事件驱动(1)

学习目标

完成本单元后,您将能够:

  • 列出基于事件的软件体系结构的组件。
  • 解释一个事件驱动的软件架构的好处。
  • 描述平台事件功能的用例。
  • 描述平台事件的特征。

了解事件驱动的软件体系结构

您的订单系统是否有包裹?打印机墨盒是否需要更换?无论您希望得到什么通知,Salesforce企业消息传递平台都可以在Salesforce内部和外部来源提供安全且可扩展的自定义通知。通过平台事件,您可以监视系统并将更改传达给其他系统。

注意

如果尚未完成,请先完成API基础模块,然后再使用该模块。熟悉Streaming API的概念是此模块的先决条件。

基于事件的沟通的范例围绕发布者 – 订阅者模型展开 – 发送者广播一个或多个接收者捕获的消息。这就像无线电传输 – 发射塔发射无线电信号,接收机获得信号,如果他们调整到正确的频率。

就像无线电传输一样,基于事件的通信从发送者流向接收者。无论接收者是否正在侦听,事件都会被发送,接收者在收到事件时不会确认。基于事件的通信可以实时进行,或者更准确地说,可以近乎实时地进行。无线电波以光速行进,但基于事件的软件和硬件系统通常有一些延迟。非必要的披露:Salesforce速度很快,但速度不及光速!

在API基础模块中,我们使用海盗船上雷达的类比来表示事件检测。这个类比适用于基于Salesforce记录更改的PushTopic事件流。该通信模型只需要一个用户。但是对于平台事件,通信有两方:发送方和接收方。它们是事件驱动架构的两个组成部分。

事件驱动系统的组件

在我们继续之前,让我们定义一些术语。

Event
在业务流程中有意义的状态变化例如,采购订单的放置是一个有意义的事件,因为订单履行中心希望在处理订单前收到通知。
Event message
包含有关事件数据的消息。也被称为事件通知。例如,事件消息可以是关于包含关于订单的信息的订单放置的通知。
Event producer
通过频道发布事件消息。例如,一个订单放置应用程序。
Event channel
事件生成器发送事件消息和事件消费者读取这些消息的事件流。在Salesforce中也称为事件总线。
Event consumer
从频道接收讯息的频道的订阅者。例如,通知新订单的订单履行应用程序。

下图说明了一个基于事件的软件体系结构。

A diagram showing components of event-based systems: event producers, which feed information into the event bus, which sends messages to the event consumers

与请求响应通信模型不同,基于事件驱动模型的软件架构将事件生成者与事件消费者分离,从而简化了连接系统中的通信模型。不需要向服务器请求获取关于某个状态的信息。相反,系统订阅事件通道,并在新状态发生时通知。任何数量的消费者都可以接收和响应相同的事件。当事件发生时,系统会获得这些信息,并可以近乎实时地对其作出反应。除了消息内容的语义之外,发送事件的系统和接收事件的系统彼此之间没有依赖关系。

Salesforce企业消息传递平台提供事件驱动软件体系结构的好处。平台事件是您的应用程序发送和接收的事件消息。它们简化了沟通变化和响应变化的过程,而无需编写复杂的逻辑。发布者和订阅者通过平台事件相互通信。一个或多个用户可以听相同的事件并执行操作。

假设一家名为“云新闻”的新闻机构向订阅的客户发送活动信息,以及有关山区撤退目的地的交通和道路状况的最新突发消息。这些事件的内容不仅仅是新闻事件本身,还包括新闻是否紧急以及事件的发生地点等相关细节。用户可以接收这些事件,并根据新闻的紧急性确定要采取的行动。

所有这一切听起来都不错,但是当你可以使用平台事件时,真实情况是什么呢?当然,平台活动的使用不限于新闻机构。以下是一些有用的应用程序。

何时使用平台事件的示例

我们来看看使用平台事件的一些业务场景。在这些情况下,Salesforce和外部系统通过平台事件消息进行通信。在第一种情况下,Salesforce中的应用程序通知产品装运订单的外部订单履行应用程序。在第二种情况下,外部产品应用程序通知Salesforce商品退货。最后一个场景显示了如何使用触发器在Salesforce中使用事件消息。

平台到外部应用程序:订单履行供应商应用程序

当Salesforce关闭一个机会时,您的公司已经赢得了与客户的交易。假设您使用供应商来运送与机会相关的产品。每个供应商都有一个处理装运订单的外部应用。外部应用程序监听平台事件。当机会关闭时,作为Salesforce产品订购应用程序一部分的触发器会触发并发布平台事件消息。每个供应商应用程序都会收到有关该事件的通知,并为特定产品创建装运订单。

In this diagram, a product order app publishes an order event to an event bus. Various vendor apps subscribe to the event bus and receive the event.

平台应用程序的外部应用程序:处理Salesforce中的商品退货

比方说,有人想把购买的商品退还给供应商。外部系统将商品退货请求发送给Salesforce进行处理。外部系统发布平台事件以提醒Salesforce返回商品。 Salesforce中的事件侦听器(触发器)接收事件并执行一些操作。例如,触发器可能会提醒销售代表退货,并向客户发送确认电子邮件。

An external vendor app publishes a platform event message for a merchandise return request. In Salesforce, a trigger subscribes to the event bus and receives the event.

平台到平台:重新分配主要记录

在Salesforce中分配销售线索时,销售线索触发器会触发并检查与销售线索所有者相关的未决商机和案例。根据相关记录,触发器发布由Salesforce应用程序接收的事件。根据事件信息,应用程序将重新分配潜在客户并创建一个Chatter帖子。

在这种情况下,您可以使用其他Salesforce功能执行相同的操作,例如Process Builder或流程。但是通过使用平台事件,您可以从基于事件的编程模型和跨应用程序的标准编程方式中受益。

In this diagram, an app in Salesforce publishes a platform event. A trigger subscribes to this event channel and receives the event.

平台事件特征

现在您已经了解了何时使用平台事件,让我们深入了解其组件和特性。

您可以定义平台事件包含的自定义数据。就像自定义对象一样,您可以在Salesforce中定义平台事件。通过给它一个名称并添加自定义字段来创建一个平台事件定义。以下是云新闻社新闻事件的自定义字段的示例定义。

字段标签/名称 字段API名称 字段类型
Location Location__c Text

Length: 100

Urgent Urgent__c Checkbox
News Content News_Content__c Text Area (Long)

平台事件和sObjects

平台事件是一种特殊的Salesforce实体,在很多方面与sObject类似。事件消息是平台事件的实例,类似于记录是自定义对象的实例。与自定义对象不同,您不能更新或删除事件记录,也不能在Salesforce用户界面中查看事件记录。

您可以设置读取和创建平台事件的权限。您向配置文件或权限集中的用户授予权限。

在本机和外部应用程序中使用平台事件

平台事件支持Salesforce内部和外部应用程序中的事件消息流。 Salesforce平台上的应用程序使用Apex方法发布事件,并使用Apex触发器来消费事件。此外,Visualforce和Lightning组件应用程序可以使用CometD订阅事件。作为代码的替代方法,您可以使用声明性工具(如Process Builder和Cloud Flow Designer)发布事件。最后,外部应用程序使用sObject API发布事件,并使用CometD客户端消费事件。如您所见,在选择使用平台事件方面有很大的灵活性!

平台事件和其他流式事件之间的差异

其他流媒体事件呢?其他事件包括PushTopic和通用事件。借助PushTopic事件,客户端将根据预定义的查询接收有关Salesforce记录更改的消息。使用通用事件,您可以发送和接收任意消息内容(有效内容),而不一定与Salesforce记录绑定。平台事件与通用事件类似,但提供更强大的自定义功能。借助平台事件,您可以发布任何自定义数据。您可以将粒度级别的事件数据模式定义为键入的字段。另外,您可以在本地Salesforce平台应用程序和外部应用程序中使用平台事件。在以下情况下使用平台事件:

  • 使用预定义模式发送和接收自定义事件数据
  • 发布或订阅Apex中的活动
  • 为了在Salesforce平台上和以外发布和处理事件的灵活性该表比较了一般事件和平台事件的特征。

功能通用事件平台事件

特征 通用事件 平台事件
将事件模式定义为类型字段 Check mark
包含用户定义的有效载荷 Check mark Check mark
通过一个或多个API发布事件 Check mark Check mark
通过Apex发布活动 Check mark
通过CometD订阅 Check mark Check mark
通过Apex触发器订阅 Check mark
使用Process Builder以声明方式发布并流动复选标记 Check mark

在下一个单元中,我们将定义一个平台事件并发布事件。