You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Salesforce中通过Flow发布平台事件的异步错误处理方案咨询

用Flow发布平台事件时的异步错误处理方案

你说得没错,Flow里「创建记录」元素的故障路径确实只能处理同步阶段的排队错误——比如事件记录不符合字段校验、达到平台事件并发限制导致无法入队这类即时问题,真正的异步发布错误(比如后台分发失败、订阅端处理报错导致重试耗尽)没法靠这个路径捕获。下面是几个实操性强的处理方案:

方案一:利用平台事件的死信队列统一留存失败事件

平台事件自带重试机制:异步发布失败时(比如订阅的Apex触发器抛出未捕获异常),Salesforce会自动重试最多24次(间隔从1分钟逐步递增到几小时)。如果所有重试都失败,你可以通过死信队列留存这些事件:

  • 先在平台事件的设置页面启用「死信队列」,所有重试失败的事件会被自动存入死信队列对象(EventBus.DeadLetterEvent)。
  • 处理死信队列的方式:
    • 用Apex定时任务(Schedulable)定期查询死信队列中的记录,把事件ID、失败原因、事件内容等信息写入自定义的错误日志对象(比如PlatformEventErrorLog__c)。
    • 搭配记录触发Flow:当死信队列有新记录时,自动触发Flow将错误信息同步到日志表,或者给运维人员发送提醒邮件。

方案二:用Apex封装发布逻辑,Flow调用Apex动作

既然Apex的EventBus.EventPublishCallback能捕获异步发布错误,你可以把平台事件的发布逻辑封装成可被Flow调用的Apex动作,替代原生的「创建记录」元素:

  1. 实现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;
    }
}
  1. 写一个带@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;
    }
}
  1. 在Flow里添加「调用Apex动作」元素,调用这个Apex方法并传递事件参数,这样同步入队错误和异步发布错误都能被统一捕获记录。

方案三:在订阅端直接记录处理错误

如果你的平台事件有明确的订阅者(Apex触发器、订阅Flow、外部系统),可以在订阅端直接处理错误:

  • 若是Apex订阅触发器:用try-catch块包裹处理逻辑,捕获异常时把事件ID、异常信息、处理时间写入自定义日志对象。
  • 若是Flow订阅:在订阅Flow里添加故障路径,捕获处理阶段的错误,同样记录到日志表或触发通知。

内容的提问来源于stack exchange,提问作者RM_EM2LQyOngoArEZj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:07:44