Salesforce Trailhead's Create a Custom Channel and Enrich Change Events tutorial shows how to create new Change Data Capture (CDC) channels providing "enriched" messages, i.e., those having certain fields always present. While CREATE and UNDELETE event messages always provide all non-null fields, UPDATE and DELETE events do not, but event enriching can be used for the latter two cases. For example, in my previous tutorial, it would be more readable to always return the Account Name in update and delete events so it can be logged alongside the Account Salesforce ID. And the tutorial gives an example of creating a custom External Account ID field in Salesforce that can be provided in every message and used to identify an account record in the external system for synchronization.
Some drawbacks/limitations of event enriching:
I expanded my CDC listener sample from the previous tutorial to allow for reading from a custom channel "CDCSample__chn" instead of the standard AccountChangeEvent. The channels can be switched just by adjusting the configuration file and restarting the application. Unfortunately, I was unable to get the Account "Name" property to always be provided in the message as an enriched field. I tried five or six other Account fields and they all worked fine, I'm not sure what the problem with Name is, whether my error or a Salesforce bug.
Using Salesforce's Postman project and the Trailhead tutorial, below are the commands I ran to create and configure this custom channel. Main thing to keep in mind is that a channel is a holder for message event streams, but not a message stream itself. A channel contains one or more channel members, with each member providing messages on a particular entity. It is also with the channel member that any desired enriched fields are defined.Creating the custom Platform Event Channel:
POST to: {{_endpoint}}/services/data/v{{version}}/tooling/sobjects/PlatformEventChannel with body: { "FullName": "CDCSample__chn", "Metadata": { "channelType": "data", "label": "Custom Channel for Change Data Capture Sample" } }
There should be a success message giving the Salesforce ID of the new channel. Metadata on the PlatformEventChannel can be queried using the following GET call:
{{_endpoint}}/services/data/v{{version}}/tooling/query/?q=SELECT Id, FullName FROM PlatformEventChannel WHERE DeveloperName='CDCSample'
Creating a PlatformEventChannelMember in the PlatformEventChannel. Here I'm choosing three fields to always appear.
POST to {{_endpoint}}/services/data/v{{version}}/tooling/sobjects/PlatformEventChannelMember { "FullName": "CDCSample_chn_AccountChangeEvent", "Metadata": { "enrichedFields": [ { "name": "Industry" }, { "name": "Name" }, { "name": "TickerSymbol" } ], "eventChannel": "CDCSample__chn", "selectedEntity": "AccountChangeEvent" } }
The success message provides the ID for the Channel Member, whose details can be later queried with a GET similar to the following:
{{_endpoint}}/services/data/v{{version}}/tooling/sobjects/PlatformEventChannelMember/0v85e0000004Cl7AAE
Sample output:
{ "attributes": { "type": "PlatformEventChannelMember", "url": "/services/data/v51.0/tooling/sobjects/PlatformEventChannelMember/0v85e0000004Cl7AAE" }, "Id": "0v85e0000004Cl7AAE", "IsDeleted": false, "DeveloperName": "CDCSample_chn_AccountChangeEvent", "Language": "en_US", "MasterLabel": "AccountChangeEvent", "NamespacePrefix": null, "ManageableState": "unmanaged", "CreatedDate": "2021-05-15T16:01:21.000+0000", "CreatedById": "0055e000000nMxcAAE", "LastModifiedDate": "2021-05-19T10:27:59.000+0000", "LastModifiedById": "0055e000000nMxcAAE", "SystemModstamp": "2021-05-19T10:27:59.000+0000", "FullName": "CDCSample_chn_AccountChangeEvent", "Metadata": { "enrichedFields": [ { "name": "Industry" }, { "name": "Name" }, { "name": "TickerSymbol" } ], "eventChannel": "CDCSample__chn", "selectedEntity": "AccountChangeEvent", "urls": null }, "EventChannel": "0YL5e0000008OIAGA2", "SelectedEntity": "AccountChangeEvent" }
Above query provides the enriched fields, but for links to them specifically, this query can be used:
{{_endpoint}}/services/data/v{{version}}/tooling/query/?q=SELECT Id,ChannelMemberId,Field FROM EnrichedField ORDER BY ChannelMemberId
Keep this tutorial page handy for whenever it is needed to adjust the enriched fields of a platform event channel member. It involves PATCH requests to the endpoint originally used to create the stream.
Posted by Glen Mazza in Salesforce CRM at 03:00AM May 19, 2021 | Tags: salesforce platform-events change-data-capture cometd | Comments[0]