

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

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

## Cuándo se debe usar
<a name="monetization-functions-types-sequential-executor-when"></a>

A `SEQUENTIAL_EXECUTOR` ejecuta una serie de funciones de una en una, en orden. Cada paso puede utilizar los resultados de los pasos anteriores.

Úselo `SEQUENTIAL_EXECUTOR` cuando su lógica requiera varios pasos que dependan de los resultados de los demás. Entre los casos de uso más habituales se incluyen la obtención de datos de identidad y su posterior utilización para recuperar segmentos de audiencia, realizar un paso de clasificación y, a continuación, llamar de forma condicional a distintos servicios externos en función del resultado obtenido, y crear direcciones URL de solicitudes de anuncios complejas a partir de varias fuentes de datos.

## Campos de configuración
<a name="monetization-functions-types-sequential-executor-fields"></a>

Una `SEQUENTIAL_EXECUTOR` función tiene los siguientes campos:
+ **Tiempo de ejecución**: el lenguaje de expresión. Establézcalo en`JSONATA`.
+ **FunctionList**— Una lista ordenada de 1 a 10 pasos. Cada paso especifica `FunctionId` la función que se va a ejecutar. Si lo desea, puede añadir una `RunCondition` expresión para controlar si el paso se ejecuta o se omite.
+ **Salida**: define los valores que se generarán una vez completados todos los pasos. Cada entrada asigna una clave de salida (por ejemplo`player_params.envelope`) a una expresión que puede hacer referencia a los datos generados por cualquier paso de la secuencia. Si se omite, se utilizan todos los resultados de las funciones individuales de la secuencia.
+ **TimeoutMilliseconds**(obligatorio): el tiempo máximo para que se complete toda la secuencia. Si la secuencia supera este tiempo de espera, MediaTailor descarta todos los resultados de la secuencia.

## Ejecución ordenada y flujo de datos
<a name="monetization-functions-types-sequential-executor-data-flow"></a>

MediaTailor ejecuta cada paso de la secuencia desde el primero hasta el último. Una vez completado cada paso, los valores que produce se combinan en un conjunto continuo de resultados. Los pasos siguientes pueden acceder a los datos originales de la sesión y a todos los valores generados por los pasos anteriores.

Los datos temporales son el mecanismo principal para pasar datos entre los pasos. Cuando una función escribe en una `temp.*` clave, el siguiente paso puede leer ese valor. Los parámetros del reproductor y los campos de solicitud de anuncios escritos en los pasos anteriores también están visibles en los pasos posteriores.

**nota**  
Los datos temporales aceptan cualquier tipo de datos, incluidos objetos y matrices. Los parámetros del reproductor y los campos de solicitud de anuncios solo aceptan cadenas, números, valores booleanos y nulos.

## Per-step condiciones de ejecución
<a name="monetization-functions-types-sequential-executor-run-conditions"></a>

Cada paso de la secuencia tiene un `RunCondition` campo opcional. Este campo contiene una expresión que devuelve `true` o`false`. MediaTailor evalúa la `RunCondition` expresión inmediatamente antes de ejecutar ese paso.

Si la `RunCondition` expresión se evalúa como`false`, MediaTailor omite el paso por completo y pasa al siguiente. Si se omite el `RunCondition` campo, el paso siempre se ejecuta.

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

Este mecanismo te permite crear canalizaciones condicionales. Por ejemplo, puede ejecutar una búsqueda de identidad en el paso 1 y, a continuación, ejecutar de forma condicional una búsqueda de segmentos en el paso 2 solo si el paso 1 arrojó una identidad válida.

## Cómo funciona el bloque de salida
<a name="monetization-functions-types-sequential-executor-output"></a>

El bloque de salida de a `SEQUENTIAL_EXECUTOR` controla lo que produce la secuencia una vez completados todos los pasos:
+ **Bloque de salida presente**: MediaTailor evalúa las expresiones del bloque de salida comparándolas con el estado acumulado final y guarda solo esas salidas. Se descartan todas las salidas producidas por pasos anteriores a las que no se haga referencia en el bloque de salida secuencial.
+ No **hay bloque de salida**: MediaTailor guarda directamente todas las salidas acumuladas de todos los pasos.

**sugerencia**  
Omita el bloque de salida cuando desee que pase la salida de todas las funciones. Añada un bloque de salida cuando necesite filtrar, cambiar el nombre o transformar los resultados acumulados antes de guardarlos.

## Configuración del tiempo de espera
<a name="monetization-functions-types-sequential-executor-timeout"></a>

El `TimeoutMilliseconds` campo establece una fecha límite para toda la secuencia. Este tiempo de espera cubre todos los pasos, incluidas las llamadas HTTP realizadas por las funciones. Si la secuencia supera el tiempo de espera, MediaTailor descarta todos los resultados de la secuencia y continúa como si no hubiera ninguna función asociada.

`HTTP_REQUEST`Las funciones individuales siguen respetando su propia configuración. `RequestTimeoutMilliseconds` El tiempo de espera de la secuencia actúa como un límite exterior que limita el tiempo total de ejecución.

## Ejemplo: reinténtelo en caso de error de HTTP
<a name="monetization-functions-types-sequential-executor-example"></a>

En este ejemplo, se llama a una API de identidad y se vuelve a intentar automáticamente si la primera llamada devuelve un error de servidor. Utiliza dos funciones HTTP\_REQUEST orquestadas por un SEQUENTIAL\_EXECUTOR.

**Paso 1: Primary fetch (): `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%}"
        }
    }
}
```

**Paso 2: volver a intentarlo en caso de error ()`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%}"
        }
    }
}
```

**Secuencia (`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%}"
        }
    }
}
```

**Cómo funciona:**

1. `fetchIdentity`llama a la API de identidad y escribe el código de estado y el sobre en`temp.*`.

1. Si el código de estado es 500 o superior, `RunCondition` el paso 2 se evalúa `true` y se `retryIdentity` ejecuta. Se sobrescribe `temp.statusCode` y `temp.envelope` con la respuesta de reintento.

1. Si la primera llamada se realizó correctamente, se omite el paso 2.

1. La secuencia en la que escribe `temp.envelope` el bloque de salida. `player_params.envelope`