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里的错误信息反馈,但部分版本可能出现服务端未正确返回失败条目的情况(比如你遇到的这个版本)。
要实现客户端在总线不存在时抛异常,需要手动校验结果并处理:
检查PutEventsResult的返回细节
遍历返回的Entries列表,每个PutEventsResultEntry如果包含ErrorCode和ErrorMessage,说明该条目发送失败。总线不存在时,通常会返回ResourceNotFoundException错误码。手动抛出异常
当检测到存在失败条目,且错误码匹配总线不存在的情况时,直接抛出自定义异常或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()); } } }
- 额外验证:提前检查总线是否存在
如果需要更严格的校验,可以在发送事件前,调用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
相关产品推荐
相关产品推荐

