

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

`PutEvents` 動作可在單一請求中將多個[事件](eb-events.md)傳送至 EventBridge。如需詳細資訊，請參閱《Amazon EventBridge API 參考》**中的 [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html) 和 *AWS CLI 命令參考*中的 [Put-Events](https://docs.aws.amazon.com/cli/latest/reference/events/put-events.html)。

每個 `PutEvents` 請求可支援有限數量的項目。如需詳細資訊，請參閱 [Amazon 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` 參數以確認請求中是否有失敗的項目。如果其值非為零，您可以將具有非 null 值之 `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>

當您使用 `PutEvents`動作將自訂事件傳送至 EventBridge 時，您最多可以將 10 個事件項目批次處理為一個請求以提高效率。請求總大小，也就是請求中所有事件項目的總和，必須小於 1 MB。此限制適用於整個請求，不適用於個別項目。如果單一事件是請求中的唯一項目，則最多可以使用完整的 1 MB。您可以在傳送事件之前計算項目大小。



**注意**  
*項目*有大小的限制。即使項目小於大小限制，由於事件之 JSON 表示法的必要字元和鍵，EventBridge 中的*事件*始終大於項目大小。如需詳細資訊，請參閱 [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`中包含 。