# RabbitMQ

O **RabbitMQ** permite a publicação de mensagens em um *broker* RabbitMQ.

## Parâmetros

Dê uma olhada nas opções de configuração do conector. Parâmetros suportados por [expressões *Double Braces*](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/double-braces/overview) estão marcados com `(DB)`.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>SSL/TLS</strong></td><td>Ativa o método de autenticação SSL/TLS ao se conectar a um servidor RabbitMQ.</td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>Account</strong></td><td><p>Conta do tipo <em>Basic</em> necessária para se autenticar utilizando o método <em>basic</em>.</p><p><br>Essa opção só está disponível se o parâmetro <strong>SSL/TLS</strong> for desativado.</p></td><td>N/A</td><td><em>Account</em></td></tr><tr><td><strong>Key Store</strong></td><td><p>Conta do tipo <em>Certificate-chain</em> (no formato <em>PEM</em>) contendo os certificados necessários do cliente para se autenticar utilizando o método SSL/TLS.</p><p><br>Essa opção só está disponível se o parâmetro <strong>SSL/TLS</strong> for ativado.</p></td><td>N/A</td><td><em>Account</em></td></tr><tr><td><strong>Trust Store</strong></td><td><p>Conta do tipo <em>Certificate-chain</em> (no formato <em>PEM</em>) contendo o <em>trust material</em> necessário para se autenticar utilizando o método SSL/TLS.</p><p><br>Essa opção só está disponível se o parâmetro <strong>SSL/TLS</strong> for ativado.</p></td><td>N/A</td><td><em>Account</em></td></tr><tr><td><strong>Hostname Verification</strong></td><td><p>Se ativado, será verificado se o certificado do servidor foi emitido para o <em>hostname</em> ao qual está sendo feita a conexão.</p><p><br>Essa opção só está disponível se o parâmetro <strong>SSL/TLS</strong> for ativado.</p></td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>Hostname</strong></td><td>Nome do <em>host</em> que executa o RabbitMQ.</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Port</strong></td><td>Porta de conexão do RabbitMQ (padrão: 5672).</td><td>5672</td><td>Inteiro</td></tr><tr><td><strong>Connection Timeout</strong></td><td>Tempo máximo para conexão ao RabbitMQ.</td><td>60000</td><td>Inteiro</td></tr><tr><td><strong>Virtual Host</strong></td><td>Nome do grupo lógico dentro do RabbitMQ ao qual se deseja conectar.</td><td>/</td><td><em>String</em></td></tr><tr><td><strong>Exchange Name</strong> <code>(DB)</code></td><td>Nome do <em>exchange</em> definido no RabbitMQ ao qual se deseja enviar mensagens.</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Binary Message</strong></td><td>Se a opção estiver ativada, a mensagem será considerada binária e o campo <em>Message Body</em> deverá informar uma <em>string</em> contendo a representação <em>base64</em> do conjunto de <em>bytes</em> a enviar; do contrário, a mensagem será considerada como texto.</td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>Message Body</strong> <code>(DB)</code></td><td>Conteúdo da mensagem a ser enviada.</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Routing Key</strong></td><td><em>String</em> representando a chave de relacionamento entre o <em>Exchange</em> e a(s) Fila(s).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Headers</strong></td><td>Conjunto de entradas chave-valor (<em>key-value</em>) contendo cabeçalhos que serão enviados na mensagem (campo opcional).</td><td>N/A</td><td><em>Key-value</em></td></tr><tr><td><strong>Message Type</strong></td><td><em>String</em> representando o tipo de mensagem (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Message Content Type</strong></td><td><em>String</em> representando o tipo de conteúdo da mensagem (ex.: a<em>pplication</em>/json) (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Message Content Encoding</strong></td><td><em>String</em> representando a codificação do conteúdo (ex.: UTF-8) (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Priority</strong></td><td>Número indicando a prioridade da mensagem (campo opcional).</td><td>N/A</td><td>Inteiro</td></tr><tr><td><strong>Correlation ID</strong></td><td><em>String</em> representando o ID de correlação da mensagem (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Message ID</strong></td><td><em>String</em> representando o ID da mensagem (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Delivery Mode</strong></td><td>Se "<em>Persistent Message</em>", então a mensagem é enviada com a <em>flag</em> persistente e o <em>broker</em> tentará mantê-la em disco assim que possível; se "<em>Transient Message</em>", então o <em>broker</em> tentará manter a mensagem em memória.</td><td><em>Persistent Message</em></td><td><em>String</em></td></tr><tr><td><strong>Reply To</strong></td><td><em>String</em> representando o endereço de retorno da mensagem (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Message Expiration</strong></td><td>Número representando o tempo de duração da mensagem em fila (também conhecido como TTL) (campo opcional).</td><td>N/A</td><td>Inteiro</td></tr><tr><td><strong>Message Timestamp</strong></td><td>Número representando o <em>timestamp</em> da mensagem (campo opcional).</td><td>N/A</td><td>Inteiro</td></tr><tr><td><strong>Application Name</strong></td><td><em>String</em> representando o nome da aplicação (campo opcional).</td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Fail On Error</strong></td><td>Se a opção estiver habilitada, a execução do <em>pipeline</em> com erro será interrompida; do contrário, a execução do <em>pipeline</em> continua, mas o resultado vai mostrar um valor falso para a propriedade "<em>success</em>".</td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>Wait for a Publish Acknowledgement</strong></td><td>Se a opção estiver ativada, o conector aguardará por uma confirmação de publicação da mensagem; do contrário, o conector enviará a mensagem e não aguardará confirmação.</td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>Publisher Acknowledgement Timeout</strong></td><td>Tempo máximo que o conector aguardará por uma confirmação de publicação da mensagem.</td><td>5000</td><td>Inteiro</td></tr><tr><td><strong>Mandatory Message</strong></td><td>Se a opção estiver ativada, então a mensagem é marcada como obrigatória e um erro será lançado caso ela não possa ser roteada; do contrário, então nenhuma verificação de roteamento será feita (é necessário que a opção "<em>Wait for a Publish Acknowledgement</em>" seja habilitada).</td><td><em>False</em></td><td>Booleano</td></tr></tbody></table>

{% hint style="info" %}
Todos os parâmetros de configuração opcionais não serão definidos na mensagem caso os seus valores sejam deixados em branco.
{% endhint %}

### Exemplo de resposta de requisição ao RabbitMQ <a href="#exemplo-de-resposta-de-requisio-ao-rabbitmq" id="exemplo-de-resposta-de-requisio-ao-rabbitmq"></a>

```
<MESMA MENSAGEM QUE FOI INFORMADA NA ENTRADA>
```

{% hint style="info" %}
O **RabbitMQ** não altera a mensagem apresentada na sua entrada, exceto em caso de erro.
{% endhint %}

### Exemplo de resposta de requisição ao RabbitMQ contendo erro <a href="#exemplo-de-resposta-de-requisio-ao-rabbitmq-contendo-erro" id="exemplo-de-resposta-de-requisio-ao-rabbitmq-contendo-erro"></a>

```
{
"success": false,
"message": "Could not publish message to RabbitMQ due to an error",
"error": "java.net.SocketTimeoutException: connect timed out"
}
```

* **success:** “false” quando a operação falha.
* **message:** mensagem sobre o erro.
* **exception:** informação sobre o tipo de erro ocorrido.

## Fluxo de Mensagens <a href="#fluxo-de-mensagens" id="fluxo-de-mensagens"></a>

### Entrada <a href="#entrada" id="entrada"></a>

O conector aceita qualquer mensagem de entrada, podendo utilizá-la por meio de *Double Braces*.

### Saída <a href="#sada" id="sada"></a>

* **sem erro**

```
<A MESMA MENSAGEM INFORMADA NA ENTRADA>
```

* **com erro**

```
{
"success": false,
"message": "Could not publish message to RabbitMQ due to an error",
"error": "java.net.SocketTimeoutException: connect timed out"
}
```

## RabbitMQ em ação <a href="#h_80645f3395" id="h_80645f3395"></a>

Uma mensagem é sempre enviada através desse conector a partir do **Exchange Name** e do **Routing Key**. O *exchange* possui um *bind* com um tópico ou uma fila e direciona a mensagem a partir da *routing key*.

### Enviando uma mensagem simples <a href="#h_6588bee0be" id="h_6588bee0be"></a>

**Mensagem de entrada**:

```
{
"message": "test"
}
```

**Configurações:**

* **Hostname**: `<RABBITMQ HOSTNAME>`
* **Port**: `<PORT>` (porta padrão: 5672)
* **Virtual Host**: `/`
* **Exchange Name**: `<EXCHANGE NAME>`
* **Binary Message**: desabilitado
* **Message**: `{{ message.$ }}`
* **Routing key**: `<ROUTING KEY>`
* **Fail On Error**: desabilitado

**Resultado:**

```
{
"message": "test"
}
```

### Enviando uma mensagem binária simples <a href="#h_fdefc82d1f" id="h_fdefc82d1f"></a>

**Mensagem de entrada:**

```
{
"message": "ewoJIm1lc3NhZ2UiOiAidGVzdCIKfQo="
}
```

**Configurações:**

* **Hostname**: `<RABBITMQ HOSTNAME>`
* **Port**: `<PORT>` (porta padrão: 5672)
* **Virtual Host**: `/`
* **Exchange Name**: `<EXCHANGE NAME>`
* **Binary Message**: habilitado
* **Message**: `{{ message.message }}`
* **Routing key**: `<ROUTING KEY>`
* **Fail On Error**: desabilitado

**Resultado:**

```
{
"message": "ewoJIm1lc3NhZ2UiOiAidGVzdCIKfQo="
}
```

### Enviando uma mensagem para uma fila e a resposta será devolvida para uma outra especificada (Direct Reply-To) <a href="#h_1e95f3c10e" id="h_1e95f3c10e"></a>

**Mensagem de entrada**:

```
{
"message": "test"
}
```

**Configurações:**

* **Hostname**: `<RABBITMQ HOSTNAME>`
* **Port**: `<PORT>` (porta padrão: 5672)
* **Virtual Host**: `/`
* **Exchange Name**: `<EXCHANGE NAME>`
* **Binary Message**: desabilitado
* **Message**: `{{ message.$ }}`
* **Routing key**: `<ROUTING KEY>`
* **Reply To**: `<REPLY TO>`
* **Fail On Error**: desabilitado

**Resultado:**

```
{
"message": "test"
}
```
