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

AWS EventBus Java客户端向不存在总线发消息无报错,如何触发异常?

问题描述

使用版本1.12.440的aws-java-sdk-eventbridge调用PutEvents接口,向不存在的AWS事件总线dm-outbound-event-bus-dev发送事件时,收到了成功响应:FailedEntryCount为0且返回了EventId。现在需要实现:当使用错误的总线名称时,客户端能够抛出异常。

相关代码:

PutEventsRequestEntry requestEntry = new PutEventsRequestEntry();
requestEntry
        .withSource("test")
        .withDetailType("test")
        .withDetail(getJson())
        .withEventBusName("dm-outbound-event-bus-dev");

PutEventsRequest eventsRequest = new PutEventsRequest();
eventsRequest.withEntries(requestEntry);
PutEventsResult putEventsResult = amazonEventBridge.putEvents(eventsRequest);

// 注:dm-outbound-event-bus-dev 这个总线在AWS中不存在

收到的响应:

PutEventsResult {FailedEntryCount: 0,Entries: [{EventId: 5aea1a74-7557-077b-55e7-d665a555b3be,}]}
解决方案

AWS EventBridge的PutEvents接口本身不会直接对不存在的事件总线返回错误——服务端会先接收事件,再尝试路由到目标总线,失败后不会同步返回错误,而是通过FailedEntryCount和Entries里的错误信息反馈,但部分版本可能出现服务端未正确返回失败条目的情况(比如你遇到的这个版本)。

要实现客户端在总线不存在时抛异常,需要手动校验结果并处理:

  1. 检查PutEventsResult的返回细节
    遍历返回的Entries列表,每个PutEventsResultEntry如果包含ErrorCode和ErrorMessage,说明该条目发送失败。总线不存在时,通常会返回ResourceNotFoundException错误码。

  2. 手动抛出异常
    当检测到存在失败条目,且错误码匹配总线不存在的情况时,直接抛出自定义异常或AWS SDK提供的异常。

修改后的代码示例:

PutEventsRequestEntry requestEntry = new PutEventsRequestEntry();
requestEntry
        .withSource("test")
        .withDetailType("test")
        .withDetail(getJson())
        .withEventBusName("dm-outbound-event-bus-dev");

PutEventsRequest eventsRequest = new PutEventsRequest();
eventsRequest.withEntries(requestEntry);
PutEventsResult putEventsResult = amazonEventBridge.putEvents(eventsRequest);

// 校验结果,处理失败条目
if (putEventsResult.getFailedEntryCount() > 0) {
    for (PutEventsResultEntry entry : putEventsResult.getEntries()) {
        if (entry.getErrorCode() != null) {
            // 匹配总线不存在的错误码
            if ("ResourceNotFoundException".equals(entry.getErrorCode())) {
                throw new RuntimeException("事件总线不存在: " + entry.getErrorMessage());
                // 也可以抛出AWS SDK的ResourceNotFoundException
                // throw new ResourceNotFoundException(entry.getErrorMessage());
            }
            // 其他错误情况按需处理
            throw new RuntimeException("事件发送失败: " + entry.getErrorCode() + " - " + entry.getErrorMessage());
        }
    }
}
  1. 额外验证:提前检查总线是否存在
    如果需要更严格的校验,可以在发送事件前,调用DescribeEventBus接口检查目标总线是否存在。若不存在,直接抛出异常:
try {
    amazonEventBridge.describeEventBus(new DescribeEventBusRequest().withName("dm-outbound-event-bus-dev"));
} catch (ResourceNotFoundException e) {
    throw new RuntimeException("事件总线不存在", e);
}

// 之后再执行PutEvents逻辑

注意:调用DescribeEventBus会额外消耗一次API请求,需要权衡性能和校验需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:16