

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# `PutEvents`在 Amazon 中使用发送事件 EventBridge
<a name="eb-putevents"></a>

该`PutEvents`操作 EventBridge 在单个请求中向发送多个[事件](eb-events.md)。有关更多信息，请参阅 [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html)*Amazon EventBridge API 参考和*AWS CLI 命令*参考*中的 [put-events](https://docs.aws.amazon.com/cli/latest/reference/events/put-events.html)。

每个 `PutEvents` 请求可支持有限数目的条目。有关更多信息，请参阅 [亚马逊 EventBridge 配额](eb-quota.md)。`PutEvents` 操作将尝试按请求的自然顺序处理所有条目。在您致电后`PutEvents`，为每个事件 EventBridge 分配一个唯一的 ID。

以下示例 Java 代码向发送了两个相同的事件 EventBridge。

------
#### [ AWS SDK for Java Version 2.x ]

```
EventBridgeClient eventBridgeClient =
    EventBridgeClient.builder().build();

PutEventsRequestEntry requestEntry = PutEventsRequestEntry.builder()
    .resources("resource1", "resource2")
    .source("com.mycompany.myapp")
    .detailType("myDetailType")
    .detail("{ \"key1\": \"value1\", \"key2\": \"value2\" }")
    .build();

List <
PutEventsRequestEntry > requestEntries = new ArrayList <
PutEventsRequestEntry > ();
requestEntries.add(requestEntry);

PutEventsRequest eventsRequest = PutEventsRequest.builder()
    .entries(requestEntries)
    .build();

PutEventsResponse result = eventBridgeClient.putEvents(eventsRequest);

for (PutEventsResultEntry resultEntry: result.entries()) {
    if (resultEntry.eventId() != null) {
        System.out.println("Event Id: " + resultEntry.eventId());
    } else {
        System.out.println("PutEvents failed with Error Code: " + resultEntry.errorCode());
    }
}
```

------
#### [ AWS SDK for Java Version 1.0 ]

```
EventBridgeClient eventBridgeClient =
    EventBridgeClient.builder().build();
    
PutEventsRequestEntry requestEntry = new PutEventsRequestEntry()
        .withTime(new Date())
        .withSource("com.mycompany.myapp")
        .withDetailType("myDetailType")
        .withResources("resource1", "resource2")
        .withDetail("{ \"key1\": \"value1\", \"key2\": \"value2\" }");

PutEventsRequest request = new PutEventsRequest()
        .withEntries(requestEntry, requestEntry);

PutEventsResult result = awsEventsClient.putEvents(request);

for (PutEventsResultEntry resultEntry : result.getEntries()) {
    if (resultEntry.getEventId() != null) {
        System.out.println("Event Id: " + resultEntry.getEventId());
    } else {
        System.out.println("Injection failed with Error Code: " + resultEntry.getErrorCode());
    }
}
```

------

运行此代码后，`PutEvents` 结果将包含一组响应条目。响应数组中的每个条目对应请求数组中的一个条目，顺序按请求和响应从开始到结束的顺序。响应 `Entries` 数组包含的条目数量始终与请求数组相同。

## 使用 `PutEvents` 处理故障
<a name="eb-failure-handling"></a>

默认情况下，如果请求中的单个条目失败，则会 EventBridge 继续处理请求中的其余条目。响应 `Entries` 数组可以包括成功条目和不成功条目。您必须删除不成功的条目，并在后续调用中包括它们。

成功的结果条目包含一个 `Id` 值，不成功的结果条目包括 `ErrorCode` 和 `ErrorMessage` 值。`ErrorCode` 描述错误的类型。`ErrorMessage` 提供有关错误的更多信息。以下示例包含 `PutEvents` 请求的三个结果条目。第二个条目不成功。

```
{
    "FailedEntryCount": 1, 
    "Entries": [
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        },
        {   "ErrorCode": "InternalFailure",
            "ErrorMessage": "Internal Service Failure"
        },
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        }
    ]
}
```

**注意**  
如果您使用将事件发布`PutEvents`到不存在的事件总线，则 EventBridge 事件匹配将找不到相应的规则，因此会删除该事件。尽管 EventBridge 会发送`200`响应，但它不会使请求失败，也不会将事件包含在请求响应的`FailedEntryCount`值中。

不成功的条目可包含在后续 `PutEvents` 请求中。首先，要查找请求中是否存在失败的条目，请检查 `PutEventsResult` 中的 `FailedRecordCount` 参数。如果该参数不为零，则可以将每个具有非空值 `ErrorCode` 的 `Entry` 添加到后续请求中。以下示例展示了一个故障处理程序。

```
PutEventsRequestEntry requestEntry = new PutEventsRequestEntry()
        .withTime(new Date())
        .withSource("com.mycompany.myapp")
        .withDetailType("myDetailType")
        .withResources("resource1", "resource2")
        .withDetail("{ \"key1\": \"value1\", \"key2\": \"value2\" }");

List<PutEventsRequestEntry> putEventsRequestEntryList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    putEventsRequestEntryList.add(requestEntry);
}

PutEventsRequest putEventsRequest = new PutEventsRequest();
putEventsRequest.withEntries(putEventsRequestEntryList);
PutEventsResult putEventsResult = awsEventsClient.putEvents(putEventsRequest);

while (putEventsResult.getFailedEntryCount() > 0) {
    final List<PutEventsRequestEntry> failedEntriesList = new ArrayList<>();
    final List<PutEventsResultEntry> PutEventsResultEntryList = putEventsResult.getEntries();
    for (int i = 0; i < PutEventsResultEntryList.size(); i++) {
        final PutEventsRequestEntry putEventsRequestEntry = putEventsRequestEntryList.get(i);
        final PutEventsResultEntry putEventsResultEntry = PutEventsResultEntryList.get(i);
        if (putEventsResultEntry.getErrorCode() != null) {
            failedEntriesList.add(putEventsRequestEntry);
        }
    }
    putEventsRequestEntryList = failedEntriesList;
    putEventsRequest.setEntries(putEventsRequestEntryList);
    putEventsResult = awsEventsClient.putEvents(putEventsRequest);
    }
```

## 使用发送事件 AWS CLI
<a name="eb-send-events-aws-cli"></a>

您可以使用 AWS CLI 向发送自定义事件， EventBridge 以便对其进行处理。以下示例将一个自定义事件放入 EventBridge：

```
aws events put-events \
--entries '[{"Time": "2016-01-14T01:02:03Z", "Source": "com.mycompany.myapp", "Resources": ["resource1", "resource2"], "DetailType": "myDetailType", "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }"}]'
```

您还可以创建包含自定义事件的 JSON 文件。

```
[
  {
    "Time": "2016-01-14T01:02:03Z",
    "Source": "com.mycompany.myapp",
    "Resources": [
      "resource1",
      "resource2"
    ],
    "DetailType": "myDetailType",
    "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }"
  }
]
```

然后，要使用从该 AWS CLI 文件中读取条目并发送事件，请在命令提示符下键入：

```
aws events put-events --entries file://entries.json
```

## 计算 PutEvents 活动条目大小
<a name="eb-putevent-size"></a>

当您 EventBridge 使用`PutEvents`操作向发送自定义事件时，您可以将最多 10 个事件条目批处理到一个请求中以提高效率。请求的总大小（即请求中所有事件条目的总和）必须小于 1 MB。此限制适用于整个请求，不适用于单个条目。如果单个事件是请求中唯一的条目，则该事件最多可以占用整整 1 MB 的空间。您可以在发送事件之前计算条目大小。



**注意**  
已对*条目* 施加大小限制。即使条目小于大小限制，由于*事件* EventBridge 的 JSON 表示形式中必需的字符和键，因此中的事件也始终大于条目大小。有关更多信息，请参阅 [Amazon 上的活动 EventBridge](eb-events.md)。

EventBridge 按如下方式计算`PutEventsRequestEntry`大小：
+ 如果指定，则 `Time` 参数为 14 字节。
+ `Source` 和 `DetailType` 参数为其 UTF-8 编码形式的字节数。
+ 如果指定，则 `Detail` 参数为其 UTF-8 编码形式的字节数。
+ 如果指定，则 `Resources` 参数的每个条目为其 UTF-8 编码形式的字节数。

以下示例 Java 代码计算给定 `PutEventsRequestEntry` 对象的大小。为了验证是否未违反 1MB 限制，您需要对请求中的所有事件进行计算。

```
int getSize(PutEventsRequestEntry entry) {
    int size = 0;
    if (entry.getTime() != null) {
        size += 14;
    }
    size += entry.getSource().getBytes(StandardCharsets.UTF_8).length;
    size += entry.getDetailType().getBytes(StandardCharsets.UTF_8).length;
    if (entry.getDetail() != null) {
        size += entry.getDetail().getBytes(StandardCharsets.UTF_8).length;
    }
    if (entry.getResources() != null) {
        for (String resource : entry.getResources()) {
            if (resource != null) {
                size += resource.getBytes(StandardCharsets.UTF_8).length;
            }
        }
    }
    return size;
}
```

**注意**  
如果条目大小超过 1MB，我们建议将事件上传到 Amazon S3 存储桶，并在条`PutEvents`目`Object URL`中加入。