

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

# SEQUENTIAL\_EXECUTOR
<a name="monetization-functions-types-sequential-executor"></a>

## 使用情況
<a name="monetization-functions-types-sequential-executor-when"></a>

會依序`SEQUENTIAL_EXECUTOR`執行一系列函數。每個步驟都可以使用前步驟的結果。

當您的邏輯需要依賴彼此結果的多個步驟`SEQUENTIAL_EXECUTOR`時，請使用 。常見的使用案例包括擷取身分資料，然後使用它來擷取受眾客群、執行分類步驟，然後根據結果有條件地呼叫不同的外部服務，以及從多個資料來源建置複雜的廣告請求 URLs。

## 組態欄位
<a name="monetization-functions-types-sequential-executor-fields"></a>

`SEQUENTIAL_EXECUTOR` 函數具有下列欄位：
+ **執行時間** — 表達式語言。將此設定為 `JSONATA`。
+ **FunctionList** — 1 到 10 個步驟的排序清單。每個步驟都會指定要執行之函數`FunctionId`的 。或者，您可以新增`RunCondition`表達式來控制步驟是否執行或略過。
+ **輸出** — 定義所有步驟完成後要產生的值。每個項目都會將輸出索引鍵 （例如 `player_params.envelope`) 映射到可以參考序列中任何步驟所產生的資料的表達式。如果省略，則會使用序列中個別函數的所有輸出。
+ **TimeoutMilliseconds** （必要） — 整個序列完成的時間上限。如果序列超過此逾時，MediaTailor 會捨棄序列中的所有輸出。

## 排序的執行和資料流程
<a name="monetization-functions-types-sequential-executor-data-flow"></a>

MediaTailor 會從第一個到最後一個依序執行每個步驟。每個步驟完成後，其產生的值會合併到一組執行中的結果中。後續步驟可以存取原始工作階段資料，以及先前步驟所產生的所有值。

暫時資料是在步驟之間傳遞資料的主要機制。當函數寫入`temp.*`金鑰時，下一個步驟可以讀取該值。玩家參數和先前步驟撰寫的廣告請求欄位，也會在後續步驟中顯示。

**注意**  
暫時資料接受任何資料類型，包括物件和陣列。玩家參數和廣告請求欄位僅接受字串、數字、布林值和 null)。

## 每個步驟的執行條件
<a name="monetization-functions-types-sequential-executor-run-conditions"></a>

序列中的每個步驟都有一個選用`RunCondition`欄位。此欄位包含傳回 `true`或 的表達式`false`。MediaTailor 會在執行該步驟之前立即評估`RunCondition`運算式。

如果`RunCondition`表達式評估為 `false`，MediaTailor 會完全略過步驟並移至下一個步驟。如果省略 `RunCondition` 欄位，則步驟一律會執行。

```
{ "FunctionId": "retryFetch", "RunCondition": "{%temp.statusCode = 500%}" }
```

此機制可讓您建置條件式管道。例如，您可以在步驟 1 中執行身分擷取，然後只有在步驟 1 傳回有效的身分時，才會有條件地在步驟 2 中執行區段查詢。

## 輸出區塊的運作方式
<a name="monetization-functions-types-sequential-executor-output"></a>

序列上的輸出區塊`SEQUENTIAL_EXECUTOR`控制在所有步驟完成後產生的項目：
+ **輸出區塊存在** — MediaTailor 會根據最終累積狀態評估輸出區塊中的表達式，並僅儲存這些輸出。順序輸出區塊中未參考的先前步驟所產生的任何輸出都會遭到捨棄。
+ **輸出區塊不存在** — MediaTailor 會直接從所有步驟儲存所有累積的輸出。

**提示**  
當您希望每個函數的輸出通過時，請省略輸出區塊。當您在儲存之前需要篩選、重新命名或轉換累積的結果時，請新增輸出區塊。

## 逾時組態
<a name="monetization-functions-types-sequential-executor-timeout"></a>

`TimeoutMilliseconds` 欄位會設定整個序列的截止日期。此逾時涵蓋所有步驟，包括 函數所做的任何 HTTP 呼叫。如果序列超過逾時，MediaTailor 會捨棄序列中的所有輸出，並像未連接函數一樣繼續。

個別`HTTP_REQUEST`函數仍然遵守自己的`RequestTimeoutMilliseconds`設定。序列逾時可做為限制總執行時間的外部界限。

## 範例：HTTP 失敗時重試
<a name="monetization-functions-types-sequential-executor-example"></a>

此範例會呼叫身分 API，並在第一次呼叫傳回伺服器錯誤時自動重試。它使用兩個由 SEQUENTIAL\_EXECUTOR 協調的 HTTP\_REQUEST 函數。

**步驟 1 — 主要擷取 (`fetchIdentity`)：**

```
{
    "FunctionId": "fetchIdentity",
    "FunctionType": "HTTP_REQUEST",
    "HttpRequestConfiguration": {
        "Runtime": "JSONATA",
        "MethodType": "GET",
        "Url": "{%'https://identity.example.com/v1/resolve?ip=' & session.client_ip%}",
        "Headers": {
            "Accept": "application/json"
        },
        "RequestTimeoutMilliseconds": 1000,
        "Output": {
            "temp.statusCode": "{%response.statusCode%}",
            "temp.envelope": "{%response.statusCode = 200 ? response.body.envelope : null%}"
        }
    }
}
```

**步驟 2 — 在失敗時重試 (`retryIdentity`)：**

```
{
    "FunctionId": "retryIdentity",
    "FunctionType": "HTTP_REQUEST",
    "HttpRequestConfiguration": {
        "Runtime": "JSONATA",
        "MethodType": "GET",
        "Url": "{%'https://identity-fallback.example.com/v1/resolve?ip=' & session.client_ip%}",
        "Headers": {
            "Accept": "application/json"
        },
        "RequestTimeoutMilliseconds": 1000,
        "Output": {
            "temp.statusCode": "{%response.statusCode%}",
            "temp.envelope": "{%response.statusCode = 200 ? response.body.envelope : null%}"
        }
    }
}
```

**序列 (`identityWithRetry`)：**

```
{
    "FunctionId": "identityWithRetry",
    "FunctionType": "SEQUENTIAL_EXECUTOR",
    "SequentialExecutorConfiguration": {
        "Runtime": "JSONATA",
        "TimeoutMilliseconds": 2000,
        "FunctionList": [
            { "FunctionId": "fetchIdentity" },
            { "FunctionId": "retryIdentity", "RunCondition": "{%temp.statusCode >= 500%}" }
        ],
        "Output": {
            "player_params.envelope": "{%temp.envelope%}"
        }
    }
}
```

**運作方式：**

1. `fetchIdentity` 會呼叫身分 API，並將狀態碼和信封寫入 `temp.*`。

1. 如果狀態碼為 500 或更高，步驟 2 `RunCondition`上的 會評估為 `true`並`retryIdentity`執行。它會`temp.envelope`使用重試回應覆寫 `temp.statusCode`和 。

1. 如果第一次呼叫成功，則會略過步驟 2。

1. 序列輸出區塊`temp.envelope`會寫入 `player_params.envelope`。