# Subpipelines

{% hint style="info" %}
Para acessar os *subpipelines* e usar as funcionalidades presentes nesse artigo, você precisa ter a permissão PIPELINE:CREATE. Aprenda mais na[ documentação sobre Papéis](https://docs.digibee.com/documentation/developer-guide/pt-br/platform-administration/administration/new-access-control/access-control-roles).
{% endhint %}

*Subpipelines* são subfluxos do *pipeline* necessariamente vinculados e disparados por um componente do fluxo principal, por exemplo, o [**For Each**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/logic/for-each).

Vamos imaginar um processo chamado “Validação de Dados de Cliente”. Esse processo obtém os dados dos clientes através do *endpoint* REST e então verifica se cada registro de cliente possui os dados necessários.

Para iterar pela coleção de registros, usaremos o componente **For Each (Processa clientes)**.

<figure><img src="https://content.gitbook.com/content/cO0A6g1dOsu8BiHYqO67/blobs/EkQY6lXVD65orIsv1diO/imagem-1.png" alt=""><figcaption></figcaption></figure>

Toda vez que um componente com capacidade de iterar por coleções é adicionado a um *pipeline*, dois *subpipelines* são criados: **OnProcess** e **OnException**.

### **OnProcess** <a href="#onprocess" id="onprocess"></a>

Este *subpipeline* implementa o subfluxo que processa cada item da coleção. Ele tem seu próprio canvas, que pode ser acessado pelo menu do componente:

<figure><img src="https://content.gitbook.com/content/cO0A6g1dOsu8BiHYqO67/blobs/n5cuTdBRrdvFl7dfCneT/imagem-2.png" alt=""><figcaption></figcaption></figure>

No caso do processo “Validação de Dados de Cliente”, o *subpipeline* **OnProcess** trata todos os registros da coleção de clientes individualmente e verifica se o atributo “Data de Nascimento” está preenchido em cada um deles:

<figure><img src="https://content.gitbook.com/content/cO0A6g1dOsu8BiHYqO67/blobs/kwPV6Jr8xsdaqSXNJoSv/imagem-3.png" alt=""><figcaption></figcaption></figure>

Ao término de cada execução do *subpipeline* **OnProcess**, um atributo *success* é retornado, indicando se houve sucesso ou falha na execução. Por padrão, esse atributo é retornado com valor `“false”`. Assim, você precisa informar explicitamente quando a execução ocorrer conforme esperado.

No processo “Validação de Dados de Cliente”, a seguinte resposta de sucesso será retornada pelo componente **JSON Generator (Sucesso)** quando o atributo “Data de Nascimento” estiver preenchido:

```
{"success": true}
```

Caso o atributo “Data de Nascimento” esteja vazio, o componente **JSON Generator (Falha)** retorna o atributo com valor `“false”`:

```
{"success": false}
```

Nesse caso, é gerada uma exceção através do componente **Assert (Erro Interno)**:

<figure><img src="https://content.gitbook.com/content/cO0A6g1dOsu8BiHYqO67/blobs/Z1Ip7vwx0aOQ2qcjZirt/imagem-4.png" alt=""><figcaption></figcaption></figure>

O atributo **Fail On Error** indica que a execução do fluxo do *pipeline* será interrompida e será lançada uma exceção caso a condição do componente *Assert* não for validada.

{% hint style="info" %}
Quando a exceção é gerada por um componente de um *subpipeline*, a execução do *subpipeline* **OnException** é iniciada. Por outro lado, se a exceção decorrer de um componente do fluxo principal, a execução do *pipeline* será interrompida por erro.
{% endhint %}

### **OnException** <a href="#onexception" id="onexception"></a>

Este *subpipeline* implementa o fluxo que trata uma exceção na execução do *subpipeline* **OnProcess**. Ele tem seu próprio canvas, que pode ser acessado pelo menu do componente:

<figure><img src="https://content.gitbook.com/content/cO0A6g1dOsu8BiHYqO67/blobs/OVITpt0FBwLw1uRMHIdk/imagem-5.png" alt=""><figcaption></figcaption></figure>

Quando o **OnException** é executado no processo “Validação de Dados de Cliente”, uma chamada é feita a um *endpoint* REST, registrando o incidente e gerando uma mensagem de erro na página [*Pipeline logs*](https://docs.digibee.com/documentation/developer-guide/pt-br/development-cycle/dashboards/pipeline-logs).

<figure><img src="https://content.gitbook.com/content/cO0A6g1dOsu8BiHYqO67/blobs/y7j2IGenMBeAGRvKESmM/imagem-6.png" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
A utilização do **OnException** é opcional, no entanto, é uma prática fortemente recomendada. Diversos componentes da Digibee Integration Platform suportam o atributo **Fail On Error** e permitem que estratégias de tratamento de erro e recuperação sejam implementadas através do **OnException**, tornando o *pipeline* muito mais robusto e resiliente.
{% endhint %}

Para saber mais, leia o artigo [*Pipeline*](https://docs.digibee.com/documentation/developer-guide/pt-br/development-cycle/build-overview/pipelines).
