# informat.mq 消息队列

## 概述

使用`informat.mq`执行消息队列操作

## basicGet

从队列拉取消息

```javascript
informat.mq.basicGet(module, queue, autoAck)
```

| 参数      | 类型        | 描述                         |
|---------|-----------|----------------------------|
| module  | `String`  | 消息队列模块标识符                  |
| queue   | `String`  | 队列的标识符                     |
| autoAck | `Boolean` | 设置是否自动确认。一般设置为false，即不自动确认 |

**返回值**

类型为 [MqMessage](/guide/script/model.md#mqmessage)

::: tip
如果想获取单条消息，就要使用拉模式。但是不能用循环拉模式来代替推模式，这样会严重影响性能。
:::

**示例**

::: code-group

```javascript [调用]
var message = informat.mq.basicGet("mq", "TaskQueue", true);
console.log('message', message)
```

```json [返回值]
{
  "body": "{\r\n\t'taskId':'1',\r\n\t'taskStatus':'finished'\r\n}",
  "props": {
    "contentLength": 0,
    "deliveryTag": 1,
    "finalRetryForMessageWithNoId": false,
    "headers": {},
    "lastInBatch": false,
    "messageCount": 0,
    "projectionUsed": false,
    "publishSequenceNumber": 0,
    "receivedDeliveryMode": "NON_PERSISTENT",
    "receivedExchange": "",
    "receivedRoutingKey": "croe0zft168y3-skyduxiaoxiduilie-Test1",
    "redelivered": false
  }
}
```

:::

## publish

发送消息到队列中

```javascript
informat.mq.publish(moduleKey, routingKey, setting, message)
```

| 参数         | 类型                                                      | 描述        |
|------------|---------------------------------------------------------|-----------|
| module     | `String`                                                | 消息队列模块标识符 |
| routingKey | `String`                                                | 路由键       |
| setting    | [PublishSetting](/guide/script/model.md#publishsetting) | 发送设置      |
| message    | `String`                                                | 要发送的消息    |

::: info

- 如果开启了 setting.waitForConfirms,在消息投递后会等待消息队列确认消息已投递成功，如果投递不成功则抛出异常
- 开启setting.waitForConfirms会影响投递的性能，但是可以保证投递成功

:::

**示例**

```js
// 任务完成后发送消息队列
let body = {
    taskId: '1',
    taskStatus: 'finished'
}
informat.mq.publish('mq', 'TaskQueue', null, JSON.stringify(body));
```

## queuePurge

清空队列

```javascript
informat.mq.queuePurge(module, queue)
```

| 参数     | 类型       | 描述        |
|--------|----------|-----------|
| module | `String` | 消息队列模块标识符 |
| queue  | `String` | 队列的标识符    |

**示例**

任务完成后发送消息队列

```js
informat.mq.queuePurge('mq', 'TaskQueue');
```

## basicAck

收到消息以后，手动应答数据接收成功

```javascript
informat.mq.basicAck(message, multiple)
```

| 参数       | 类型                                            | 描述       |
|----------|-----------------------------------------------|----------|
| message  | [MqMessage](/guide/script/model.md#mqmessage) | 消息对象     |
| multiple | `Boolean`                                     | 是否支持批量确认 |

**示例**

```javascript
// 收到任务完成消息事件
informat.mq.basicAck(message, true);
```

## basicNack

Nack方式的拒绝
允许消费者拒绝一条消息，并且可选择将消息重新放回队列，或者将其丢弃

```javascript
informat.mq.basicNack(message, multiple, requeue)
```

| 参数       | 类型                                            | 描述                                                              |
|----------|-----------------------------------------------|-----------------------------------------------------------------|
| message  | [MqMessage](/guide/script/model.md#mqmessage) | 消息对象                                                            |
| multiple | `Boolean`                                     | 如果false，表示该deliveryTag消息被拒绝。如果为true，则将小于deliveryTag之前的所有消息全部拒绝。 |
| requeue  | `Boolean`                                     | 是否重新投递到队列中                                                      |

**示例**
收到任务完成消息事件,处理业务失败后

```javascript
informat.mq.basicNack(message, true, true);
```

## basicReject

Reject拒绝消息
当消息被拒绝后，并且requeue为false时 消息会被投递到死信队列中

```javascript
informat.mq.basicReject(message, requeue)
```

| 参数      | 类型                                            | 描述         |
|---------|-----------------------------------------------|------------|
| message | [MqMessage](/guide/script/model.md#mqmessage) | 消息对象       |
| requeue | `Boolean`                                     | 是否重新投递到队列中 |

**示例**

```javascript
informat.mq.basicReject(message, true);
```

## basicRecover

重新发送未被确认的消息

```javascript
informat.mq.basicRecover(message, requeue);
```

| 参数      | 类型                                            | 描述                                                                                           |
|---------|-----------------------------------------------|----------------------------------------------------------------------------------------------|
| message | [MqMessage](/guide/script/model.md#mqmessage) | 消息对象                                                                                         |
| requeue | `Boolean`                                     | 如果requeue为true，则未被确认的消息会被重新加入到队列中，这样对于同一条消息来说，可能会被分配给与之前不同的消费者。如果为false，那么同一条消息会被分配给之前相同的消费者 |

**示例**

```javascript
informat.mq.basicRecover(message, true);
```

::: tip 如果不小心在消息队列后台删除了一个队列，怎么处理？

- 可以在织信消息队列模块的配置界面，找到对应的消息队列，编辑后重新发布，平台会自动创建消息队列。

:::
