Salesforce中通过Flow发布平台事件的异步错误处理方案咨询
用Flow发布平台事件时的异步错误处理方案
你说得没错,Flow里「创建记录」元素的故障路径确实只能处理同步阶段的排队错误——比如事件记录不符合字段校验、达到平台事件并发限制导致无法入队这类即时问题,真正的异步发布错误(比如后台分发失败、订阅端处理报错导致重试耗尽)没法靠这个路径捕获。下面是几个实操性强的处理方案:
方案一:利用平台事件的死信队列统一留存失败事件
平台事件自带重试机制:异步发布失败时(比如订阅的Apex触发器抛出未捕获异常),Salesforce会自动重试最多24次(间隔从1分钟逐步递增到几小时)。如果所有重试都失败,你可以通过死信队列留存这些事件:
- 先在平台事件的设置页面启用「死信队列」,所有重试失败的事件会被自动存入死信队列对象(
EventBus.DeadLetterEvent)。 - 处理死信队列的方式:
- 用Apex定时任务(
Schedulable)定期查询死信队列中的记录,把事件ID、失败原因、事件内容等信息写入自定义的错误日志对象(比如PlatformEventErrorLog__c)。 - 搭配记录触发Flow:当死信队列有新记录时,自动触发Flow将错误信息同步到日志表,或者给运维人员发送提醒邮件。
- 用Apex定时任务(
方案二:用Apex封装发布逻辑,Flow调用Apex动作
既然Apex的EventBus.EventPublishCallback能捕获异步发布错误,你可以把平台事件的发布逻辑封装成可被Flow调用的Apex动作,替代原生的「创建记录」元素:
- 实现
EventBus.EventPublishCallback接口,在onPublishResult方法里捕获异步错误并写入自定义日志:
public class PlatformEventPublishCallback implements EventBus.EventPublishCallback { public void onPublishResult(List<EventBus.PublishResult> publishResults) { List<PlatformEventErrorLog__c> errorLogs = new List<PlatformEventErrorLog__c>(); for (EventBus.PublishResult result : publishResults) { if (!result.isSuccess()) { for (EventBus.Error error : result.getErrors()) { errorLogs.add(new PlatformEventErrorLog__c( EventId__c = result.getEventId(), ErrorMessage__c = error.getMessage(), ErrorCode__c = error.getCode(), CreatedBy__c = UserInfo.getUserId() )); } } } if (!errorLogs.isEmpty()) insert errorLogs; } }
- 写一个带
@InvocableMethod的Apex类,接收Flow传递的参数,创建事件并注册回调后发布:
public with sharing class PlatformEventPublisher { @InvocableMethod(label='发布平台事件并处理错误' description='发布指定平台事件,异步错误将记录到日志表') public static void publishEvent(List<EventInput> inputs) { List<MyPlatformEvent__e> events = new List<MyPlatformEvent__e>(); for (EventInput input : inputs) { events.add(new MyPlatformEvent__e( CustomField1__c = input.Field1, CustomField2__c = input.Field2 )); } EventBus.publish(events, new PlatformEventPublishCallback()); } public class EventInput { @InvocableVariable(label='自定义字段1' required=true) public String Field1; @InvocableVariable(label='自定义字段2' required=true) public String Field2; } }
- 在Flow里添加「调用Apex动作」元素,调用这个Apex方法并传递事件参数,这样同步入队错误和异步发布错误都能被统一捕获记录。
方案三:在订阅端直接记录处理错误
如果你的平台事件有明确的订阅者(Apex触发器、订阅Flow、外部系统),可以在订阅端直接处理错误:
- 若是Apex订阅触发器:用
try-catch块包裹处理逻辑,捕获异常时把事件ID、异常信息、处理时间写入自定义日志对象。 - 若是Flow订阅:在订阅Flow里添加故障路径,捕获处理阶段的错误,同样记录到日志表或触发通知。
内容的提问来源于stack exchange,提问作者RM_EM2LQyOngoArEZj
相关产品推荐
相关产品推荐

