redis-smq 7.0.0-rc.4 → 7.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codecov.yml +5 -0
- package/CHANGELOG.md +23 -0
- package/README.md +46 -43
- package/dist/src/common/redis-keys/redis-keys.js +1 -1
- package/dist/src/lib/consumer/consumer-heartbeat.d.ts +3 -3
- package/dist/src/lib/consumer/consumer-heartbeat.js +12 -14
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/acknowledge-message.d.ts +2 -2
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/acknowledge-message.js +1 -1
- package/dist/src/lib/consumer/consumer-message-handler/consume-message.d.ts +4 -2
- package/dist/src/lib/consumer/consumer-message-handler/consume-message.js +18 -17
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/dead-letter-message.d.ts +2 -2
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/dead-letter-message.js +1 -1
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/delay-message.d.ts +2 -2
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/delay-message.js +1 -1
- package/dist/src/lib/consumer/consumer-message-handler/dequeue-message.d.ts +2 -2
- package/dist/src/lib/consumer/consumer-message-handler/message-handler.d.ts +4 -1
- package/dist/src/lib/consumer/consumer-message-handler/message-handler.js +46 -23
- package/dist/src/lib/consumer/consumer-message-handler/multiplexed-message-handler/multiplexed-message-handler.js +3 -16
- package/dist/src/lib/consumer/consumer-message-handler/processing-queue.d.ts +3 -1
- package/dist/src/lib/consumer/consumer-message-handler/processing-queue.js +11 -5
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/requeue-message.d.ts +2 -2
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/requeue-message.js +1 -1
- package/dist/src/lib/consumer/consumer-message-handler/retry-message.d.ts +15 -0
- package/dist/src/lib/{broker → consumer/consumer-message-handler}/retry-message.js +26 -8
- package/dist/src/lib/consumer/consumer.d.ts +13 -11
- package/dist/src/lib/consumer/consumer.js +2 -2
- package/dist/src/lib/producer/producer.js +1 -1
- package/dist/src/lib/{broker → producer}/schedule-message.d.ts +0 -0
- package/dist/src/lib/{broker → producer}/schedule-message.js +1 -1
- package/dist/src/lib/queue-manager/queue-rate-limit.d.ts +2 -2
- package/dist/src/workers/delay.worker.js +1 -1
- package/dist/src/workers/{heartbeat-monitor.worker.d.ts → watchdog.worker.d.ts} +5 -4
- package/dist/src/workers/watchdog.worker.js +74 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +2 -2
- package/package.json +2 -2
- package/dist/src/lib/broker/retry-message.d.ts +0 -6
- package/dist/src/lib/consumer/offline-consumers.d.ts +0 -4
- package/dist/src/lib/consumer/offline-consumers.js +0 -18
- package/dist/src/workers/heartbeat-monitor.worker.js +0 -23
package/.codecov.yml
ADDED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 7.0.0-rc.7 (2022-06-07)
|
|
4
|
+
|
|
5
|
+
* Update redis keys prefix (a6ca852)
|
|
6
|
+
* Use codecov instead of coveralls (d8b5f83)
|
|
7
|
+
* Improve consuming-messages/test00013 (5cd823c)
|
|
8
|
+
* Improve consuming-messages/test00010 (a9a4f47)
|
|
9
|
+
* Test WatchdogWorker (73fbe9a)
|
|
10
|
+
* Clean up (aa9a51a)
|
|
11
|
+
* Improve unacknowleged messages handling, refactor (005c6a0)
|
|
12
|
+
* Fix outdated javascript examples (e31f89c)
|
|
13
|
+
* Keep a clean directory structure (642739f)
|
|
14
|
+
* Update README.md (5c011e3)
|
|
15
|
+
* Clean up tests (10ebb77)
|
|
16
|
+
|
|
17
|
+
## 7.0.0-rc.6 (2022-05-31)
|
|
18
|
+
|
|
19
|
+
* Bump up redis-smq-common to v1.0.0-rc.11 (43717f0)
|
|
20
|
+
|
|
21
|
+
## 7.0.0-rc.5 (2022-05-31)
|
|
22
|
+
|
|
23
|
+
* Bump up redis-smq-common to v1.0.0-rc.10 (e025525)
|
|
24
|
+
* Update docs (738d9d0)
|
|
25
|
+
|
|
3
26
|
## 7.0.0-rc.4 (2022-05-30)
|
|
4
27
|
|
|
5
28
|
* Update README.md (fef27c1)
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<p>
|
|
9
9
|
<a href="https://github.com/weyoss/redis-smq/actions/workflows/tests.yml"><img src="https://github.com/weyoss/redis-smq/actions/workflows/tests.yml/badge.svg" alt="Tests" style="max-width:100%;" /></a>
|
|
10
|
-
<a href="https://
|
|
10
|
+
<a href="https://codecov.io/github/weyoss/redis-smq?branch=master" rel="nofollow"><img src="https://img.shields.io/codecov/c/github/weyoss/redis-smq" alt="Coverage Status" /></a>
|
|
11
11
|
<a href="https://npmjs.org/package/redis-smq" rel="nofollow"><img src="https://img.shields.io/npm/v/redis-smq.svg" alt="NPM version" /></a>
|
|
12
12
|
<a href="https://npmjs.org/package/redis-smq" rel="nofollow"><img src="https://img.shields.io/npm/dm/redis-smq.svg" alt="NPM downloads" /></a>
|
|
13
13
|
<a href="https://lgtm.com/projects/g/weyoss/redis-smq/context:javascript" rel="nofollow"><img src="https://img.shields.io/lgtm/grade/javascript/github/weyoss/redis-smq.svg?logo=lgtm&logoWidth=18" alt="Code quality" /></a>
|
|
@@ -19,19 +19,19 @@ RedisSMQ is a Node.js library for queuing messages (aka jobs) and processing the
|
|
|
19
19
|
|
|
20
20
|
## Features
|
|
21
21
|
|
|
22
|
-
* **[High-performance message processing](docs/performance.md)**
|
|
22
|
+
* **[High-performance message processing](/docs/performance.md)**
|
|
23
23
|
* **[Multi-Queue Producers](#producer-class) & [Multi-Queue Consumers](#consumer-class)**: Offering very flexible models which make RedisSMQ an ideal message broker for your microservices.
|
|
24
24
|
* **[Supporting both at-least-once/at-most-once delivery](/docs/api/message.md#messageprototypesetretrythreshold)**: In case of failures, while delivering or processing a message, RedisSMQ can guaranty that the message will be not lost and redelivered again. When configured to do so, RedisSMQ can also ensure that the message is delivered at-most-once.
|
|
25
|
-
* **[Message Expiration](docs/api/message.md#messageprototypesetttl)**: A message will not be delivered if it has been in a queue for longer than a given amount of time, called TTL (time-to-live).
|
|
26
|
-
* **[Message Consumption Timeout](docs/api/message.md#messageprototypesetconsumetimeout)**: Timeout for consuming messages.
|
|
27
|
-
* **[Queue Rate Limiting](docs/queue-rate-limiting.md)**: Allowing you to control the rate at which the messages are consumed from a given queue.
|
|
28
|
-
* **[Scheduling Messages](docs/scheduling-messages.md)**: Messages can be configured to be delayed, delivered for N times with an optional period between deliveries, and to be scheduled using CRON expressions.
|
|
29
|
-
* **[Reliable Priority Queues](docs/priority-queues.md)**: Supports priority messaging.
|
|
30
|
-
* **[Multiplexing](docs/multiplexing.md)**: A feature which allows message handlers to use a single redis connection to dequeue and consume messages.
|
|
25
|
+
* **[Message Expiration](/docs/api/message.md#messageprototypesetttl)**: A message will not be delivered if it has been in a queue for longer than a given amount of time, called TTL (time-to-live).
|
|
26
|
+
* **[Message Consumption Timeout](/docs/api/message.md#messageprototypesetconsumetimeout)**: Timeout for consuming messages.
|
|
27
|
+
* **[Queue Rate Limiting](/docs/queue-rate-limiting.md)**: Allowing you to control the rate at which the messages are consumed from a given queue.
|
|
28
|
+
* **[Scheduling Messages](/docs/scheduling-messages.md)**: Messages can be configured to be delayed, delivered for N times with an optional period between deliveries, and to be scheduled using CRON expressions.
|
|
29
|
+
* **[Reliable Priority Queues](/docs/priority-queues.md)**: Supports priority messaging.
|
|
30
|
+
* **[Multiplexing](/docs/multiplexing.md)**: A feature which allows message handlers to use a single redis connection to dequeue and consume messages.
|
|
31
31
|
* **[HTTP API](https://github.com/weyoss/redis-smq-monitor)**: an HTTP interface is provided to interact with the MQ.
|
|
32
32
|
* **[Web UI](https://github.com/weyoss/redis-smq-monitor-client)**: RedisSMQ can be managed also from your web browser.
|
|
33
33
|
* **[Logging](https://github.com/weyoss/redis-smq-common/blob/master/docs/logs.md)**: Comes with a built-in JSON logger. But you can also use your own logger instance.
|
|
34
|
-
* **[Configurable](docs/configuration.md)**: Many options and features can be configured.
|
|
34
|
+
* **[Configurable](/docs/configuration.md)**: Many options and features can be configured.
|
|
35
35
|
* **Both redis & ioredis clients are supported**: RedisSMQ can be configured to use either `redis` or `ioredis` to connect to Redis server.
|
|
36
36
|
* **Rigorously tested**: With 100+ tests and code coverage no less than 80%.
|
|
37
37
|
* **Highly optimized**: Strongly-typed and implemented using pure callbacks, with small memory footprint and no memory leaks. See [callbacks vs promises vs async/await benchmarks](http://bluebirdjs.com/docs/benchmarks.html).
|
|
@@ -41,7 +41,7 @@ RedisSMQ is a Node.js library for queuing messages (aka jobs) and processing the
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-

|
|
44
|
+

|
|
45
45
|
|
|
46
46
|
## Table of Content
|
|
47
47
|
|
|
@@ -53,17 +53,18 @@ RedisSMQ is a Node.js library for queuing messages (aka jobs) and processing the
|
|
|
53
53
|
1. [Message Class](#message-class)
|
|
54
54
|
2. [Producer Class](#producer-class)
|
|
55
55
|
3. [Consumer Class](#consumer-class)
|
|
56
|
+
1. [Message Acknowledgement](#message-acknowledgement)
|
|
56
57
|
2. Advanced Topics
|
|
57
|
-
1. [Scheduling Messages](docs/scheduling-messages.md)
|
|
58
|
-
2. [Priority Queues](docs/priority-queues.md)
|
|
59
|
-
3. [Queue Rate Limiting](docs/queue-rate-limiting.md)
|
|
60
|
-
4. [Multiplexing](docs/multiplexing.md)
|
|
61
|
-
5. [Message Manager](docs/api/message-manager.md)
|
|
62
|
-
6. [Queue Manager](docs/api/queue-manager.md)
|
|
58
|
+
1. [Scheduling Messages](/docs/scheduling-messages.md)
|
|
59
|
+
2. [Priority Queues](/docs/priority-queues.md)
|
|
60
|
+
3. [Queue Rate Limiting](/docs/queue-rate-limiting.md)
|
|
61
|
+
4. [Multiplexing](/docs/multiplexing.md)
|
|
62
|
+
5. [Message Manager](/docs/api/message-manager.md)
|
|
63
|
+
6. [Queue Manager](/docs/api/queue-manager.md)
|
|
63
64
|
7. [HTTP API](https://github.com/weyoss/redis-smq-monitor)
|
|
64
65
|
8. [Web UI](https://github.com/weyoss/redis-smq-monitor-client)
|
|
65
66
|
9. [Logs](https://github.com/weyoss/redis-smq-common/blob/master/docs/logs.md)
|
|
66
|
-
5. [RedisSMQ Architecture](docs/redis-smq-architecture.md)
|
|
67
|
+
5. [RedisSMQ Architecture](/docs/redis-smq-architecture.md)
|
|
67
68
|
6. [Performance](#performance)
|
|
68
69
|
7. [Contributing](#contributing)
|
|
69
70
|
8. [License](#license)
|
|
@@ -88,7 +89,7 @@ Considerations:
|
|
|
88
89
|
|
|
89
90
|
## Configuration
|
|
90
91
|
|
|
91
|
-
See [Configuration](docs/configuration.md) for more details.
|
|
92
|
+
See [Configuration](/docs/configuration.md) for more details.
|
|
92
93
|
|
|
93
94
|
## Usage
|
|
94
95
|
|
|
@@ -129,11 +130,11 @@ message
|
|
|
129
130
|
|
|
130
131
|
The `Message` class provides many methods for setting up different message parameters such as message body, message priority, message TTL, etc.
|
|
131
132
|
|
|
132
|
-
See [Message Reference](docs/api/message.md) for more details.
|
|
133
|
+
See [Message Reference](/docs/api/message.md) for more details.
|
|
133
134
|
|
|
134
135
|
#### Producer Class
|
|
135
136
|
|
|
136
|
-
`Producer`
|
|
137
|
+
A `Producer` instance allows you to publish a message to a queue.
|
|
137
138
|
|
|
138
139
|
You can use a single `Producer` instance to produce messages, including messages with priority, to multiple queues.
|
|
139
140
|
|
|
@@ -162,23 +163,21 @@ producer.produce(message, (err) => {
|
|
|
162
163
|
});
|
|
163
164
|
```
|
|
164
165
|
|
|
165
|
-
See [Producer Reference](docs/api/producer.md) for more details.
|
|
166
|
+
See [Producer Reference](/docs/api/producer.md) for more details.
|
|
166
167
|
|
|
167
168
|
#### Consumer Class
|
|
168
169
|
|
|
169
|
-
`Consumer`
|
|
170
|
+
A `Consumer` instance can be used to receive and consume messages from one or multiple queues.
|
|
170
171
|
|
|
171
|
-
|
|
172
|
+
To consume messages from a queue, the `Consumer` class provides the [consume()](/docs/api/consumer.md#consumerprototypeconsume) method which allows you to register a `message handler`.
|
|
172
173
|
|
|
173
|
-
|
|
174
|
+
A `message handler` is a function that receives a delivered message from a given queue.
|
|
174
175
|
|
|
175
|
-
|
|
176
|
+
Message handlers can be registered at any time, before or after a consumer has been started.
|
|
176
177
|
|
|
177
|
-
|
|
178
|
+
In contrast to producers, consumers are not automatically started upon creation. To start a consumer use the [run()](/docs/api/consumer.md#consumerprototyperun) method.
|
|
178
179
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
To shut down and remove a given `message handler` from your consumer, use the [cancel()](/docs/api/consumer.md#consumerprototypecancel) method.
|
|
180
|
+
To stop consuming messages from a queue and to remove the associated `message handler` from your consumer, use the [cancel()](/docs/api/consumer.md#consumerprototypecancel) method.
|
|
182
181
|
|
|
183
182
|
To shut down completely your consumer and tear down all message handlers, use the [shutdown()](/docs/api/consumer.md#consumerprototypeshutdown) method.
|
|
184
183
|
|
|
@@ -202,33 +201,37 @@ consumer.consume('test_queue', messageHandler, (err) => {
|
|
|
202
201
|
consumer.run();
|
|
203
202
|
```
|
|
204
203
|
|
|
204
|
+
##### Message Acknowledgement
|
|
205
|
+
|
|
205
206
|
Once a message is received, to acknowledge it, you invoke the callback function without arguments, as shown in the example above.
|
|
206
207
|
|
|
207
|
-
Message acknowledgment informs the MQ that
|
|
208
|
+
Message acknowledgment informs the MQ that the delivered message has been successfully consumed.
|
|
209
|
+
|
|
210
|
+
If an error occurred while processing a message, you can unacknowledge it by passing in the error to the callback function.
|
|
208
211
|
|
|
209
|
-
|
|
212
|
+
By default, unacknowledged messages are re-queued and delivered again unless **message retry threshold** is exceeded.
|
|
210
213
|
|
|
211
|
-
|
|
214
|
+
Delivered messages that couldn't be processed or can not be delivered to consumers are moved to a system generated queue called **dead-letter queue (DLQ)**.
|
|
212
215
|
|
|
213
|
-
|
|
216
|
+
By default, RedisSMQ does not store acknowledged and dead-lettered messages for saving disk and memory spaces, and also to increase message processing performance.
|
|
214
217
|
|
|
215
|
-
|
|
218
|
+
If you need such feature, you can enable it from your [configuration](/docs/configuration.md) object.
|
|
216
219
|
|
|
217
|
-
See [Consumer Reference](docs/api/consumer.md) for more details.
|
|
220
|
+
See [Consumer Reference](/docs/api/consumer.md) for more details.
|
|
218
221
|
|
|
219
222
|
### Advanced Topics
|
|
220
223
|
|
|
221
|
-
* [Scheduling Messages](docs/scheduling-messages.md)
|
|
224
|
+
* [Scheduling Messages](/docs/scheduling-messages.md)
|
|
222
225
|
|
|
223
|
-
* [Priority Queues](docs/priority-queues.md)
|
|
226
|
+
* [Priority Queues](/docs/priority-queues.md)
|
|
224
227
|
|
|
225
|
-
* [Queue Rate Limiting](docs/queue-rate-limiting.md)
|
|
228
|
+
* [Queue Rate Limiting](/docs/queue-rate-limiting.md)
|
|
226
229
|
|
|
227
|
-
* [Multiplexing](docs/multiplexing.md)
|
|
230
|
+
* [Multiplexing](/docs/multiplexing.md)
|
|
228
231
|
|
|
229
|
-
* [Message Manager](docs/api/message-manager.md)
|
|
232
|
+
* [Message Manager](/docs/api/message-manager.md)
|
|
230
233
|
|
|
231
|
-
* [Queue Manager](docs/api/queue-manager.md)
|
|
234
|
+
* [Queue Manager](/docs/api/queue-manager.md)
|
|
232
235
|
|
|
233
236
|
* [HTTP API](https://github.com/weyoss/redis-smq-monitor)
|
|
234
237
|
|
|
@@ -238,11 +241,11 @@ See [Consumer Reference](docs/api/consumer.md) for more details.
|
|
|
238
241
|
|
|
239
242
|
## RedisSMQ Architecture
|
|
240
243
|
|
|
241
|
-
* See [Architecture Overview](docs/redis-smq-architecture.md).
|
|
244
|
+
* See [Architecture Overview](/docs/redis-smq-architecture.md).
|
|
242
245
|
|
|
243
246
|
## Performance
|
|
244
247
|
|
|
245
|
-
See [Performance](docs/performance.md) for more details.
|
|
248
|
+
See [Performance](/docs/performance.md) for more details.
|
|
246
249
|
|
|
247
250
|
## Contributing
|
|
248
251
|
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.redisKeys = void 0;
|
|
4
4
|
const redis_keys_error_1 = require("./redis-keys.error");
|
|
5
5
|
const keySegmentSeparator = ':';
|
|
6
|
-
const nsPrefix = 'redis-smq-
|
|
6
|
+
const nsPrefix = 'redis-smq-v7';
|
|
7
7
|
const globalNamespace = 'global';
|
|
8
8
|
var ERedisKey;
|
|
9
9
|
(function (ERedisKey) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import {
|
|
2
|
+
import { TConsumerHeartbeat } from '../../../types';
|
|
3
3
|
import { RedisClient, Ticker } from 'redis-smq-common';
|
|
4
4
|
import { EventEmitter } from 'events';
|
|
5
5
|
import { Consumer } from './consumer';
|
|
6
|
-
import { ICallback } from 'redis-smq-common/dist/types';
|
|
6
|
+
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
7
7
|
export declare class ConsumerHeartbeat extends EventEmitter {
|
|
8
8
|
protected static readonly heartbeatTTL: number;
|
|
9
9
|
protected redisClient: RedisClient;
|
|
@@ -22,5 +22,5 @@ export declare class ConsumerHeartbeat extends EventEmitter {
|
|
|
22
22
|
}[]>): void;
|
|
23
23
|
static getValidHeartbeatIds(redisClient: RedisClient, cb: ICallback<string[]>): void;
|
|
24
24
|
static getExpiredHeartbeatIds(redisClient: RedisClient, cb: ICallback<string[]>): void;
|
|
25
|
-
static
|
|
25
|
+
static handleExpiredHeartbeatId(consumerId: string | string[], multi: IRedisClientMulti): void;
|
|
26
26
|
}
|
|
@@ -7,7 +7,6 @@ const events_1 = require("../../common/events/events");
|
|
|
7
7
|
const redis_keys_1 = require("../../common/redis-keys/redis-keys");
|
|
8
8
|
const events_2 = require("events");
|
|
9
9
|
const redis_smq_common_2 = require("redis-smq-common");
|
|
10
|
-
const offline_consumers_1 = require("./offline-consumers");
|
|
11
10
|
const cpuUsageStatsRef = {
|
|
12
11
|
cpuUsage: process.cpuUsage(),
|
|
13
12
|
time: process.hrtime(),
|
|
@@ -77,7 +76,11 @@ class ConsumerHeartbeat extends events_2.EventEmitter {
|
|
|
77
76
|
this.ticker.once(events_1.events.DOWN, cb);
|
|
78
77
|
this.ticker.quit();
|
|
79
78
|
},
|
|
80
|
-
(cb) =>
|
|
79
|
+
(cb) => {
|
|
80
|
+
const multi = this.redisClient.multi();
|
|
81
|
+
ConsumerHeartbeat.handleExpiredHeartbeatId(this.consumer.getId(), multi);
|
|
82
|
+
multi.exec((err) => cb(err));
|
|
83
|
+
},
|
|
81
84
|
(cb) => this.redisClient.halt(cb),
|
|
82
85
|
], cb);
|
|
83
86
|
}
|
|
@@ -163,18 +166,13 @@ class ConsumerHeartbeat extends events_2.EventEmitter {
|
|
|
163
166
|
cb(null, consumerIds !== null && consumerIds !== void 0 ? consumerIds : []);
|
|
164
167
|
});
|
|
165
168
|
}
|
|
166
|
-
static
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
(0, offline_consumers_1.handleOfflineConsumer)(config, multi, redisClient, consumerId, done);
|
|
174
|
-
}, () => multi.exec((err) => cb(err)));
|
|
175
|
-
}
|
|
176
|
-
else
|
|
177
|
-
cb();
|
|
169
|
+
static handleExpiredHeartbeatId(consumerId, multi) {
|
|
170
|
+
const { keyHeartbeats, keyHeartbeatConsumerWeight } = redis_keys_1.redisKeys.getMainKeys();
|
|
171
|
+
const ids = typeof consumerId === 'string' ? [consumerId] : consumerId;
|
|
172
|
+
ids.forEach((consumerId) => {
|
|
173
|
+
multi.hdel(keyHeartbeats, consumerId);
|
|
174
|
+
multi.zrem(keyHeartbeatConsumerWeight, consumerId);
|
|
175
|
+
});
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
exports.ConsumerHeartbeat = ConsumerHeartbeat;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RedisClient } from 'redis-smq-common';
|
|
2
|
-
import { Message } from '
|
|
2
|
+
import { Message } from '../../message/message';
|
|
3
3
|
import { ICallback } from 'redis-smq-common/dist/types';
|
|
4
|
-
import { IRequiredConfig } from '
|
|
4
|
+
import { IRequiredConfig } from '../../../../types';
|
|
5
5
|
export declare function acknowledgeMessage(config: IRequiredConfig, redisClient: RedisClient, message: Message, keyQueueProcessing: string, cb: ICallback<void>): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.acknowledgeMessage = void 0;
|
|
4
|
-
const redis_keys_1 = require("
|
|
4
|
+
const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
|
|
5
5
|
function acknowledgeMessage(config, redisClient, message, keyQueueProcessing, cb) {
|
|
6
6
|
const queue = message.getRequiredQueue();
|
|
7
7
|
const { store, queueSize, expire } = config.messages.store.acknowledged;
|
|
@@ -2,12 +2,14 @@ import { Message } from '../../message/message';
|
|
|
2
2
|
import { EMessageUnacknowledgedCause } from '../../../../types';
|
|
3
3
|
import { MessageHandler } from './message-handler';
|
|
4
4
|
import { RedisClient } from 'redis-smq-common';
|
|
5
|
+
import { ICompatibleLogger } from 'redis-smq-common/dist/types';
|
|
5
6
|
export declare class ConsumeMessage {
|
|
6
7
|
protected keyQueueProcessing: string;
|
|
7
8
|
protected messageHandler: MessageHandler;
|
|
8
9
|
protected redisClient: RedisClient;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
protected logger: ICompatibleLogger;
|
|
11
|
+
constructor(messageHandler: MessageHandler, redisClient: RedisClient, logger: ICompatibleLogger);
|
|
12
|
+
protected unacknowledgeMessage(msg: Message, cause: EMessageUnacknowledgedCause): void;
|
|
11
13
|
protected consumeMessage(msg: Message): void;
|
|
12
14
|
handleReceivedMessage(message: Message): void;
|
|
13
15
|
}
|
|
@@ -4,27 +4,28 @@ exports.ConsumeMessage = void 0;
|
|
|
4
4
|
const message_1 = require("../../message/message");
|
|
5
5
|
const types_1 = require("../../../../types");
|
|
6
6
|
const events_1 = require("../../../common/events/events");
|
|
7
|
-
const consumer_error_1 = require("../errors/consumer.error");
|
|
8
7
|
const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
8
|
+
const redis_smq_common_1 = require("redis-smq-common");
|
|
9
|
+
const retry_message_1 = require("./retry-message");
|
|
10
|
+
const acknowledge_message_1 = require("./acknowledge-message");
|
|
11
11
|
class ConsumeMessage {
|
|
12
|
-
constructor(messageHandler, redisClient) {
|
|
12
|
+
constructor(messageHandler, redisClient, logger) {
|
|
13
13
|
this.redisClient = redisClient;
|
|
14
14
|
this.messageHandler = messageHandler;
|
|
15
15
|
const { keyQueueProcessing } = redis_keys_1.redisKeys.getQueueConsumerKeys(messageHandler.getQueue(), messageHandler.getConsumerId());
|
|
16
16
|
this.keyQueueProcessing = keyQueueProcessing;
|
|
17
|
+
this.logger = logger;
|
|
17
18
|
}
|
|
18
|
-
unacknowledgeMessage(msg, cause
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
(0, retry_message_1.retryMessage)(this.messageHandler.getConfig(), this.redisClient, this.keyQueueProcessing, msg, cause, (err, deadLetterCause) => {
|
|
19
|
+
unacknowledgeMessage(msg, cause) {
|
|
20
|
+
(0, retry_message_1.retryMessage)(this.messageHandler.getConfig(), this.redisClient, this.keyQueueProcessing, msg, cause, (err, retryStatus) => {
|
|
22
21
|
if (err)
|
|
23
22
|
this.messageHandler.handleError(err);
|
|
23
|
+
else if (!retryStatus)
|
|
24
|
+
this.messageHandler.handleError(new redis_smq_common_1.errors.EmptyCallbackReplyError());
|
|
24
25
|
else {
|
|
25
|
-
this.messageHandler.emit(events_1.events.MESSAGE_UNACKNOWLEDGED, msg,
|
|
26
|
-
if (
|
|
27
|
-
this.messageHandler.emit(events_1.events.MESSAGE_DEAD_LETTERED, msg
|
|
26
|
+
this.messageHandler.emit(events_1.events.MESSAGE_UNACKNOWLEDGED, msg, types_1.EMessageUnacknowledgedCause.CONSUME_ERROR);
|
|
27
|
+
if (retryStatus.status === retry_message_1.ERetryStatus.MESSAGE_DEAD_LETTERED) {
|
|
28
|
+
this.messageHandler.emit(events_1.events.MESSAGE_DEAD_LETTERED, msg);
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
});
|
|
@@ -45,8 +46,10 @@ class ConsumeMessage {
|
|
|
45
46
|
if (this.messageHandler.isRunning() && !isTimeout) {
|
|
46
47
|
if (timer)
|
|
47
48
|
clearTimeout(timer);
|
|
48
|
-
if (err)
|
|
49
|
-
this.
|
|
49
|
+
if (err) {
|
|
50
|
+
this.logger.error(err);
|
|
51
|
+
this.unacknowledgeMessage(msg, types_1.EMessageUnacknowledgedCause.UNACKNOWLEDGED);
|
|
52
|
+
}
|
|
50
53
|
else {
|
|
51
54
|
(0, acknowledge_message_1.acknowledgeMessage)(this.messageHandler.getConfig(), this.redisClient, msg, this.keyQueueProcessing, (err) => {
|
|
52
55
|
if (err)
|
|
@@ -60,10 +63,8 @@ class ConsumeMessage {
|
|
|
60
63
|
this.messageHandler.getHandler()(message_1.Message.createFromMessage(msg), onConsumed);
|
|
61
64
|
}
|
|
62
65
|
catch (error) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
: new consumer_error_1.ConsumerError(`An error occurred while processing message ID (${msg.getRequiredId()})`);
|
|
66
|
-
this.unacknowledgeMessage(msg, types_1.EMessageUnacknowledgedCause.CAUGHT_ERROR, err);
|
|
66
|
+
this.logger.error(error);
|
|
67
|
+
this.unacknowledgeMessage(msg, types_1.EMessageUnacknowledgedCause.CONSUME_ERROR);
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
handleReceivedMessage(message) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EMessageDeadLetterCause, EMessageUnacknowledgedCause, IRequiredConfig } from '
|
|
2
|
-
import { Message } from '
|
|
1
|
+
import { EMessageDeadLetterCause, EMessageUnacknowledgedCause, IRequiredConfig } from '../../../../types';
|
|
2
|
+
import { Message } from '../../message/message';
|
|
3
3
|
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
4
4
|
import { RedisClient } from 'redis-smq-common';
|
|
5
5
|
export declare function deadLetterMessage(config: IRequiredConfig, mixed: IRedisClientMulti, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause, deadLetterCause: EMessageDeadLetterCause): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.deadLetterMessage = void 0;
|
|
4
|
-
const redis_keys_1 = require("
|
|
4
|
+
const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
|
|
5
5
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
6
6
|
function deadLetterMessageTransaction(config, mixed, message, keyQueueProcessing) {
|
|
7
7
|
const queue = message.getRequiredQueue();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EMessageUnacknowledgedCause } from '
|
|
2
|
-
import { Message } from '
|
|
1
|
+
import { EMessageUnacknowledgedCause } from '../../../../types';
|
|
2
|
+
import { Message } from '../../message/message';
|
|
3
3
|
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
4
4
|
import { RedisClient } from 'redis-smq-common';
|
|
5
5
|
export declare function delayMessageTransaction(mixed: IRedisClientMulti, message: Message, keyQueueProcessing: string): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.delayMessage = exports.delayMessageTransaction = void 0;
|
|
4
|
-
const redis_keys_1 = require("
|
|
4
|
+
const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
|
|
5
5
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
6
6
|
function delayMessageTransaction(mixed, message, keyQueueProcessing) {
|
|
7
7
|
const queue = message.getRequiredQueue();
|
|
@@ -14,8 +14,8 @@ export declare class DequeueMessage {
|
|
|
14
14
|
protected priorityQueuing: boolean;
|
|
15
15
|
constructor(messageHandler: MessageHandler, redisClient: RedisClient);
|
|
16
16
|
protected dequeueMessageWithPriority(cb: ICallback<string>): void;
|
|
17
|
-
protected waitForMessage(cb: ICallback<string>): void;
|
|
18
|
-
protected dequeueMessage(cb: ICallback<string>): void;
|
|
17
|
+
protected waitForMessage(cb: ICallback<string | null>): void;
|
|
18
|
+
protected dequeueMessage(cb: ICallback<string | null>): void;
|
|
19
19
|
dequeue(): void;
|
|
20
20
|
run(cb: ICallback<void>): void;
|
|
21
21
|
quit(cb: ICallback<void>): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { IPlugin, IRequiredConfig, TConsumerMessageHandler, TQueueParams } from '../../../../types';
|
|
3
3
|
import { EventEmitter } from 'events';
|
|
4
|
+
import { TCleanUpStatus } from './processing-queue';
|
|
4
5
|
import { DequeueMessage } from './dequeue-message';
|
|
5
6
|
import { ConsumeMessage } from './consume-message';
|
|
6
7
|
import { Consumer } from '../consumer';
|
|
@@ -22,6 +23,8 @@ export declare class MessageHandler extends EventEmitter {
|
|
|
22
23
|
constructor(consumer: Consumer, queue: TQueueParams, handler: TConsumerMessageHandler, dequeueRedisClient: RedisClient, sharedRedisClient: RedisClient, logger: ICompatibleLogger);
|
|
23
24
|
protected registerEventsHandlers(): void;
|
|
24
25
|
protected initPlugins(): void;
|
|
26
|
+
protected cleanUp(cb: ICallback<void>): void;
|
|
27
|
+
protected tearDownPlugins(cb: ICallback<void>): void;
|
|
25
28
|
handleError(err: Error): void;
|
|
26
29
|
dequeue(): void;
|
|
27
30
|
run(cb: ICallback<void>): void;
|
|
@@ -32,5 +35,5 @@ export declare class MessageHandler extends EventEmitter {
|
|
|
32
35
|
getConfig(): IRequiredConfig;
|
|
33
36
|
isRunning(): boolean;
|
|
34
37
|
getHandler(): TConsumerMessageHandler;
|
|
35
|
-
static cleanUp(config: IRequiredConfig, redisClient: RedisClient, consumerId: string, queue: TQueueParams, pendingMulti: IRedisClientMulti | undefined, cb: ICallback<
|
|
38
|
+
static cleanUp(config: IRequiredConfig, redisClient: RedisClient, consumerId: string, queue: TQueueParams, pendingMulti: IRedisClientMulti | undefined, cb: ICallback<TCleanUpStatus>): void;
|
|
36
39
|
}
|
|
@@ -10,6 +10,7 @@ const dequeue_message_1 = require("./dequeue-message");
|
|
|
10
10
|
const consume_message_1 = require("./consume-message");
|
|
11
11
|
const plugins_1 = require("../../../plugins/plugins");
|
|
12
12
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
13
|
+
const retry_message_1 = require("./retry-message");
|
|
13
14
|
class MessageHandler extends events_2.EventEmitter {
|
|
14
15
|
constructor(consumer, queue, handler, dequeueRedisClient, sharedRedisClient, logger) {
|
|
15
16
|
super();
|
|
@@ -24,7 +25,7 @@ class MessageHandler extends events_2.EventEmitter {
|
|
|
24
25
|
this.powerManager = new redis_smq_common_1.PowerManager();
|
|
25
26
|
this.logger = logger;
|
|
26
27
|
this.dequeueMessage = new dequeue_message_1.DequeueMessage(this, dequeueRedisClient);
|
|
27
|
-
this.consumeMessage = new consume_message_1.ConsumeMessage(this, dequeueRedisClient);
|
|
28
|
+
this.consumeMessage = new consume_message_1.ConsumeMessage(this, dequeueRedisClient, logger);
|
|
28
29
|
this.registerEventsHandlers();
|
|
29
30
|
this.initPlugins();
|
|
30
31
|
}
|
|
@@ -63,6 +64,30 @@ class MessageHandler extends events_2.EventEmitter {
|
|
|
63
64
|
this.plugins.push(plugin);
|
|
64
65
|
});
|
|
65
66
|
}
|
|
67
|
+
cleanUp(cb) {
|
|
68
|
+
MessageHandler.cleanUp(this.getConfig(), this.sharedRedisClient, this.consumerId, this.queue, undefined, (err, reply) => {
|
|
69
|
+
if (err)
|
|
70
|
+
cb(err);
|
|
71
|
+
else if (reply) {
|
|
72
|
+
this.logger.debug(`Message ID ${reply.message.getId()} has been ${reply.status === retry_message_1.ERetryStatus.MESSAGE_DEAD_LETTERED
|
|
73
|
+
? 'dead-lettered'
|
|
74
|
+
: 'unacknowledged'}.`);
|
|
75
|
+
cb();
|
|
76
|
+
}
|
|
77
|
+
else
|
|
78
|
+
cb();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
tearDownPlugins(cb) {
|
|
82
|
+
redis_smq_common_1.async.each(this.plugins, (plugin, index, done) => plugin.quit(done), (err) => {
|
|
83
|
+
if (err)
|
|
84
|
+
cb(err);
|
|
85
|
+
else {
|
|
86
|
+
this.plugins = [];
|
|
87
|
+
cb();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
66
91
|
handleError(err) {
|
|
67
92
|
if (this.powerManager.isRunning() || this.powerManager.isGoingUp()) {
|
|
68
93
|
this.emit(events_1.events.ERROR, err);
|
|
@@ -87,25 +112,10 @@ class MessageHandler extends events_2.EventEmitter {
|
|
|
87
112
|
const goDown = () => {
|
|
88
113
|
this.powerManager.goingDown();
|
|
89
114
|
redis_smq_common_1.async.waterfall([
|
|
90
|
-
(cb) =>
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
(cb) =>
|
|
94
|
-
redis_smq_common_1.async.each(this.plugins, (plugin, index, done) => plugin.quit(done), (err) => {
|
|
95
|
-
if (err)
|
|
96
|
-
cb(err);
|
|
97
|
-
else {
|
|
98
|
-
this.plugins = [];
|
|
99
|
-
cb();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
},
|
|
103
|
-
(cb) => {
|
|
104
|
-
MessageHandler.cleanUp(this.getConfig(), this.sharedRedisClient, this.consumerId, this.queue, undefined, cb);
|
|
105
|
-
},
|
|
106
|
-
(cb) => {
|
|
107
|
-
this.dequeueRedisClient.halt(cb);
|
|
108
|
-
},
|
|
115
|
+
(cb) => this.dequeueMessage.quit(cb),
|
|
116
|
+
(cb) => this.tearDownPlugins(cb),
|
|
117
|
+
(cb) => this.cleanUp(cb),
|
|
118
|
+
(cb) => this.dequeueRedisClient.halt(cb),
|
|
109
119
|
], (err) => {
|
|
110
120
|
if (err)
|
|
111
121
|
cb(err);
|
|
@@ -141,9 +151,17 @@ class MessageHandler extends events_2.EventEmitter {
|
|
|
141
151
|
}
|
|
142
152
|
static cleanUp(config, redisClient, consumerId, queue, pendingMulti, cb) {
|
|
143
153
|
const multi = pendingMulti !== null && pendingMulti !== void 0 ? pendingMulti : redisClient.multi();
|
|
154
|
+
let status = false;
|
|
144
155
|
redis_smq_common_1.async.waterfall([
|
|
145
156
|
(cb) => {
|
|
146
|
-
processing_queue_1.processingQueue.cleanUpProcessingQueue(config, redisClient, consumerId, queue, multi,
|
|
157
|
+
processing_queue_1.processingQueue.cleanUpProcessingQueue(config, redisClient, consumerId, queue, multi, (err, reply) => {
|
|
158
|
+
if (err)
|
|
159
|
+
cb(err);
|
|
160
|
+
else {
|
|
161
|
+
status = reply !== null && reply !== void 0 ? reply : false;
|
|
162
|
+
cb();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
147
165
|
},
|
|
148
166
|
(cb) => {
|
|
149
167
|
consumer_queues_1.consumerQueues.removeConsumer(multi, queue, consumerId);
|
|
@@ -153,9 +171,14 @@ class MessageHandler extends events_2.EventEmitter {
|
|
|
153
171
|
if (err)
|
|
154
172
|
cb(err);
|
|
155
173
|
else if (pendingMulti)
|
|
156
|
-
cb();
|
|
174
|
+
cb(null, status);
|
|
157
175
|
else
|
|
158
|
-
multi.exec((err) =>
|
|
176
|
+
multi.exec((err) => {
|
|
177
|
+
if (err)
|
|
178
|
+
cb(err);
|
|
179
|
+
else
|
|
180
|
+
cb(null, status);
|
|
181
|
+
});
|
|
159
182
|
});
|
|
160
183
|
}
|
|
161
184
|
}
|
|
@@ -22,22 +22,9 @@ class MultiplexedMessageHandler extends message_handler_1.MessageHandler {
|
|
|
22
22
|
const goDown = () => {
|
|
23
23
|
this.powerManager.goingDown();
|
|
24
24
|
redis_smq_common_1.async.waterfall([
|
|
25
|
-
(cb) =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
(cb) => {
|
|
29
|
-
redis_smq_common_1.async.each(this.plugins, (plugin, index, done) => plugin.quit(done), (err) => {
|
|
30
|
-
if (err)
|
|
31
|
-
cb(err);
|
|
32
|
-
else {
|
|
33
|
-
this.plugins = [];
|
|
34
|
-
cb();
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
},
|
|
38
|
-
(cb) => {
|
|
39
|
-
message_handler_1.MessageHandler.cleanUp(this.getConfig(), this.sharedRedisClient, this.consumerId, this.queue, undefined, cb);
|
|
40
|
-
},
|
|
25
|
+
(cb) => this.dequeueMessage.quit(cb),
|
|
26
|
+
(cb) => this.tearDownPlugins(cb),
|
|
27
|
+
(cb) => this.cleanUp(cb),
|
|
41
28
|
], (err) => {
|
|
42
29
|
if (err)
|
|
43
30
|
cb(err);
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { IRequiredConfig, TQueueParams } from '../../../../types';
|
|
2
2
|
import { RedisClient } from 'redis-smq-common';
|
|
3
3
|
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
4
|
+
import { TRetryStatus } from './retry-message';
|
|
5
|
+
export declare type TCleanUpStatus = TRetryStatus | false;
|
|
4
6
|
export declare const processingQueue: {
|
|
5
|
-
cleanUpProcessingQueue(config: IRequiredConfig, redisClient: RedisClient, consumerId: string, queue: TQueueParams, multi: IRedisClientMulti, cb: ICallback<
|
|
7
|
+
cleanUpProcessingQueue(config: IRequiredConfig, redisClient: RedisClient, consumerId: string, queue: TQueueParams, multi: IRedisClientMulti, cb: ICallback<TCleanUpStatus>): void;
|
|
6
8
|
setUpProcessingQueue(multi: IRedisClientMulti, queue: TQueueParams, consumerId: string): void;
|
|
7
9
|
getQueueProcessingQueues(redisClient: RedisClient, queue: TQueueParams, cb: ICallback<Record<string, string>>): void;
|
|
8
10
|
};
|
|
@@ -5,8 +5,8 @@ const types_1 = require("../../../../types");
|
|
|
5
5
|
const message_1 = require("../../message/message");
|
|
6
6
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
7
7
|
const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
|
|
8
|
-
const retry_message_1 = require("
|
|
9
|
-
function fetchProcessingQueueMessage(redisClient,
|
|
8
|
+
const retry_message_1 = require("./retry-message");
|
|
9
|
+
function fetchProcessingQueueMessage(redisClient, keyQueueProcessing, cb) {
|
|
10
10
|
redisClient.lrange(keyQueueProcessing, 0, 0, (err, range) => {
|
|
11
11
|
if (err)
|
|
12
12
|
cb(err);
|
|
@@ -27,13 +27,14 @@ function deleteProcessingQueue(multi, queue, processingQueue) {
|
|
|
27
27
|
exports.processingQueue = {
|
|
28
28
|
cleanUpProcessingQueue(config, redisClient, consumerId, queue, multi, cb) {
|
|
29
29
|
const { keyQueueProcessing } = redis_keys_1.redisKeys.getQueueConsumerKeys(queue, consumerId);
|
|
30
|
+
let status = false;
|
|
30
31
|
redis_smq_common_1.async.waterfall([
|
|
31
32
|
(cb) => {
|
|
32
|
-
fetchProcessingQueueMessage(redisClient,
|
|
33
|
+
fetchProcessingQueueMessage(redisClient, keyQueueProcessing, (err, msg) => {
|
|
33
34
|
if (err)
|
|
34
35
|
cb(err);
|
|
35
36
|
else if (msg) {
|
|
36
|
-
|
|
37
|
+
status = (0, retry_message_1.retryMessage)(config, multi, keyQueueProcessing, msg, types_1.EMessageUnacknowledgedCause.OFFLINE_CONSUMER);
|
|
37
38
|
cb();
|
|
38
39
|
}
|
|
39
40
|
else
|
|
@@ -44,7 +45,12 @@ exports.processingQueue = {
|
|
|
44
45
|
deleteProcessingQueue(multi, queue, keyQueueProcessing);
|
|
45
46
|
cb();
|
|
46
47
|
},
|
|
47
|
-
],
|
|
48
|
+
], (err) => {
|
|
49
|
+
if (err)
|
|
50
|
+
cb(err);
|
|
51
|
+
else
|
|
52
|
+
cb(null, status);
|
|
53
|
+
});
|
|
48
54
|
},
|
|
49
55
|
setUpProcessingQueue(multi, queue, consumerId) {
|
|
50
56
|
const { keyQueueProcessing, keyProcessingQueues, keyQueueProcessingQueues, } = redis_keys_1.redisKeys.getQueueConsumerKeys(queue, consumerId);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EMessageUnacknowledgedCause } from '
|
|
2
|
-
import { Message } from '
|
|
1
|
+
import { EMessageUnacknowledgedCause } from '../../../../types';
|
|
2
|
+
import { Message } from '../../message/message';
|
|
3
3
|
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
4
4
|
import { RedisClient } from 'redis-smq-common';
|
|
5
5
|
export declare function requeueMessage(mixed: IRedisClientMulti, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.requeueMessage = void 0;
|
|
4
|
-
const redis_keys_1 = require("
|
|
4
|
+
const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
|
|
5
5
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
6
6
|
function requeueMessage(mixed, message, keyQueueProcessing, unacknowledgedCause, cb) {
|
|
7
7
|
const queue = message.getRequiredQueue();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EMessageUnacknowledgedCause, IRequiredConfig } from '../../../../types';
|
|
2
|
+
import { Message } from '../../message/message';
|
|
3
|
+
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
4
|
+
import { RedisClient } from 'redis-smq-common';
|
|
5
|
+
export declare enum ERetryStatus {
|
|
6
|
+
MESSAGE_DELAYED = 0,
|
|
7
|
+
MESSAGE_REQUEUED = 1,
|
|
8
|
+
MESSAGE_DEAD_LETTERED = 2
|
|
9
|
+
}
|
|
10
|
+
export declare type TRetryStatus = {
|
|
11
|
+
status: ERetryStatus;
|
|
12
|
+
message: Message;
|
|
13
|
+
};
|
|
14
|
+
export declare function retryMessage(config: IRequiredConfig, mixed: IRedisClientMulti, processingQueue: string, message: Message, unacknowledgedCause: EMessageUnacknowledgedCause): TRetryStatus;
|
|
15
|
+
export declare function retryMessage(config: IRequiredConfig, mixed: RedisClient, processingQueue: string, message: Message, unacknowledgedCause: EMessageUnacknowledgedCause, cb: ICallback<TRetryStatus>): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.retryMessage = void 0;
|
|
4
|
-
const types_1 = require("
|
|
3
|
+
exports.retryMessage = exports.ERetryStatus = void 0;
|
|
4
|
+
const types_1 = require("../../../../types");
|
|
5
5
|
const dead_letter_message_1 = require("./dead-letter-message");
|
|
6
6
|
const requeue_message_1 = require("./requeue-message");
|
|
7
7
|
const delay_message_1 = require("./delay-message");
|
|
@@ -12,6 +12,12 @@ var EValidateAction;
|
|
|
12
12
|
EValidateAction[EValidateAction["REQUEUE"] = 1] = "REQUEUE";
|
|
13
13
|
EValidateAction[EValidateAction["DELAY"] = 2] = "DELAY";
|
|
14
14
|
})(EValidateAction || (EValidateAction = {}));
|
|
15
|
+
var ERetryStatus;
|
|
16
|
+
(function (ERetryStatus) {
|
|
17
|
+
ERetryStatus[ERetryStatus["MESSAGE_DELAYED"] = 0] = "MESSAGE_DELAYED";
|
|
18
|
+
ERetryStatus[ERetryStatus["MESSAGE_REQUEUED"] = 1] = "MESSAGE_REQUEUED";
|
|
19
|
+
ERetryStatus[ERetryStatus["MESSAGE_DEAD_LETTERED"] = 2] = "MESSAGE_DEAD_LETTERED";
|
|
20
|
+
})(ERetryStatus = exports.ERetryStatus || (exports.ERetryStatus = {}));
|
|
15
21
|
function getRetryAction(message, unacknowledgedCause) {
|
|
16
22
|
if (unacknowledgedCause === types_1.EMessageUnacknowledgedCause.TTL_EXPIRED ||
|
|
17
23
|
message.getSetExpired()) {
|
|
@@ -46,12 +52,14 @@ function retryTransaction(config, mixed, processingQueue, message, unacknowledge
|
|
|
46
52
|
const r = getRetryAction(message, unacknowledgedCause);
|
|
47
53
|
if (r.action === EValidateAction.DEAD_LETTER) {
|
|
48
54
|
(0, dead_letter_message_1.deadLetterMessage)(config, mixed, message, processingQueue, unacknowledgedCause, r.deadLetterCause);
|
|
49
|
-
return
|
|
55
|
+
return { message, status: ERetryStatus.MESSAGE_DEAD_LETTERED };
|
|
50
56
|
}
|
|
51
57
|
if (r.action === EValidateAction.REQUEUE) {
|
|
52
|
-
|
|
58
|
+
(0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause);
|
|
59
|
+
return { message, status: ERetryStatus.MESSAGE_REQUEUED };
|
|
53
60
|
}
|
|
54
|
-
|
|
61
|
+
(0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause);
|
|
62
|
+
return { message, status: ERetryStatus.MESSAGE_DELAYED };
|
|
55
63
|
}
|
|
56
64
|
function retryMessage(config, mixed, processingQueue, message, unacknowledgedCause, cb) {
|
|
57
65
|
if (mixed instanceof redis_smq_common_1.RedisClient) {
|
|
@@ -63,13 +71,23 @@ function retryMessage(config, mixed, processingQueue, message, unacknowledgedCau
|
|
|
63
71
|
if (err)
|
|
64
72
|
cb(err);
|
|
65
73
|
else
|
|
66
|
-
cb(null,
|
|
74
|
+
cb(null, { message, status: ERetryStatus.MESSAGE_DEAD_LETTERED });
|
|
67
75
|
});
|
|
68
76
|
}
|
|
69
77
|
if (r.action === EValidateAction.DELAY) {
|
|
70
|
-
return (0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause,
|
|
78
|
+
return (0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause, (err) => {
|
|
79
|
+
if (err)
|
|
80
|
+
cb(err);
|
|
81
|
+
else
|
|
82
|
+
cb(null, { message, status: ERetryStatus.MESSAGE_DELAYED });
|
|
83
|
+
});
|
|
71
84
|
}
|
|
72
|
-
return (0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause,
|
|
85
|
+
return (0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause, (err) => {
|
|
86
|
+
if (err)
|
|
87
|
+
cb(err);
|
|
88
|
+
else
|
|
89
|
+
cb(null, { message, status: ERetryStatus.MESSAGE_REQUEUED });
|
|
90
|
+
});
|
|
73
91
|
}
|
|
74
92
|
else {
|
|
75
93
|
return retryTransaction(config, mixed, processingQueue, message, unacknowledgedCause);
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { TConsumerMessageHandler, TConsumerRedisKeys, TConsumerInfo, TQueueParams, IConfig } from '../../../types';
|
|
2
|
+
import { ConsumerHeartbeat } from './consumer-heartbeat';
|
|
2
3
|
import { Base } from '../base';
|
|
3
|
-
import {
|
|
4
|
+
import { MessageHandlerRunner } from './consumer-message-handler/message-handler-runner';
|
|
5
|
+
import { RedisClient, WorkerRunner } from 'redis-smq-common';
|
|
4
6
|
import { ICallback, TUnaryFunction } from 'redis-smq-common/dist/types';
|
|
5
7
|
export declare class Consumer extends Base {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
protected readonly redisKeys: TConsumerRedisKeys;
|
|
9
|
+
protected readonly messageHandlerRunner: MessageHandlerRunner;
|
|
10
|
+
protected heartbeat: ConsumerHeartbeat | null;
|
|
11
|
+
protected workerRunner: WorkerRunner | null;
|
|
10
12
|
constructor(config?: IConfig, useMultiplexing?: boolean);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
protected setUpHeartbeat: (cb: ICallback<void>) => void;
|
|
14
|
+
protected tearDownHeartbeat: (cb: ICallback<void>) => void;
|
|
15
|
+
protected setUpConsumerWorkers: (cb: ICallback<void>) => void;
|
|
16
|
+
protected tearDownConsumerWorkers: (cb: ICallback<void>) => void;
|
|
17
|
+
protected runMessageHandlers: (cb: ICallback<void>) => void;
|
|
18
|
+
protected shutdownMessageHandlers: (cb: ICallback<void>) => void;
|
|
17
19
|
protected goingUp(): TUnaryFunction<ICallback<void>>[];
|
|
18
20
|
protected goingDown(): TUnaryFunction<ICallback<void>>[];
|
|
19
21
|
consume(queue: string | TQueueParams, messageHandler: TConsumerMessageHandler, cb: ICallback<void>): void;
|
|
@@ -11,7 +11,7 @@ const multiplexed_message_handler_runner_1 = require("./consumer-message-handler
|
|
|
11
11
|
const queue_1 = require("../queue-manager/queue");
|
|
12
12
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
13
13
|
const delay_worker_1 = require("../../workers/delay.worker");
|
|
14
|
-
const
|
|
14
|
+
const watchdog_worker_1 = require("../../workers/watchdog.worker");
|
|
15
15
|
const requeue_worker_1 = require("../../workers/requeue.worker");
|
|
16
16
|
const schedule_worker_1 = require("../../workers/schedule.worker");
|
|
17
17
|
class Consumer extends base_1.Base {
|
|
@@ -50,7 +50,7 @@ class Consumer extends base_1.Base {
|
|
|
50
50
|
this.workerRunner.on(events_1.events.ERROR, (err) => this.emit(events_1.events.ERROR, err));
|
|
51
51
|
this.workerRunner.once(events_1.events.UP, cb);
|
|
52
52
|
this.workerRunner.addWorker(new delay_worker_1.default(redisClient, true));
|
|
53
|
-
this.workerRunner.addWorker(new
|
|
53
|
+
this.workerRunner.addWorker(new watchdog_worker_1.default(redisClient, this.config, true, this.logger));
|
|
54
54
|
this.workerRunner.addWorker(new requeue_worker_1.default(redisClient, true));
|
|
55
55
|
this.workerRunner.addWorker(new schedule_worker_1.default(redisClient, true));
|
|
56
56
|
this.workerRunner.run();
|
|
@@ -10,7 +10,7 @@ const plugins_1 = require("../../plugins/plugins");
|
|
|
10
10
|
const message_queue_required_error_1 = require("./errors/message-queue-required.error");
|
|
11
11
|
const message_already_published_error_1 = require("./errors/message-already-published.error");
|
|
12
12
|
const redis_client_1 = require("../../common/redis-client/redis-client");
|
|
13
|
-
const schedule_message_1 = require("
|
|
13
|
+
const schedule_message_1 = require("./schedule-message");
|
|
14
14
|
const queue_1 = require("../queue-manager/queue");
|
|
15
15
|
class Producer extends base_1.Base {
|
|
16
16
|
constructor(config = {}) {
|
|
File without changes
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.scheduleMessage = void 0;
|
|
4
4
|
const redis_keys_1 = require("../../common/redis-keys/redis-keys");
|
|
5
|
-
const message_not_scheduled_error_1 = require("
|
|
5
|
+
const message_not_scheduled_error_1 = require("./errors/message-not-scheduled.error");
|
|
6
6
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
7
7
|
const redis_client_1 = require("../../common/redis-client/redis-client");
|
|
8
8
|
function scheduleMessageTransaction(multi, message) {
|
|
@@ -8,7 +8,7 @@ export declare class QueueRateLimit {
|
|
|
8
8
|
constructor(config: IRequiredConfig, redisClient: RedisClient, logger: ICompatibleLogger);
|
|
9
9
|
clear(queue: string | TQueueParams, cb: ICallback<void>): void;
|
|
10
10
|
set(queue: string | TQueueParams, rateLimit: TQueueRateLimit, cb: ICallback<void>): void;
|
|
11
|
-
get(queue: string | TQueueParams, cb: ICallback<TQueueRateLimit>): void;
|
|
11
|
+
get(queue: string | TQueueParams, cb: ICallback<TQueueRateLimit | null>): void;
|
|
12
12
|
static hasExceeded(redisClient: RedisClient, queue: TQueueParams, rateLimit: TQueueRateLimit, cb: ICallback<boolean>): void;
|
|
13
|
-
static get(config: IRequiredConfig, redisClient: RedisClient, queue: string | TQueueParams, cb: ICallback<TQueueRateLimit>): void;
|
|
13
|
+
static get(config: IRequiredConfig, redisClient: RedisClient, queue: string | TQueueParams, cb: ICallback<TQueueRateLimit | null>): void;
|
|
14
14
|
}
|
|
@@ -4,7 +4,7 @@ exports.DelayWorker = void 0;
|
|
|
4
4
|
const redis_keys_1 = require("../common/redis-keys/redis-keys");
|
|
5
5
|
const message_1 = require("../lib/message/message");
|
|
6
6
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
7
|
-
const schedule_message_1 = require("../lib/
|
|
7
|
+
const schedule_message_1 = require("../lib/producer/schedule-message");
|
|
8
8
|
class DelayWorker extends redis_smq_common_1.Worker {
|
|
9
9
|
constructor(redisClient, managed) {
|
|
10
10
|
super(managed);
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { RedisClient, Worker } from 'redis-smq-common';
|
|
2
|
-
import { ICallback } from 'redis-smq-common/dist/types';
|
|
2
|
+
import { ICallback, ICompatibleLogger } from 'redis-smq-common/dist/types';
|
|
3
3
|
import { IRequiredConfig } from '../../types';
|
|
4
|
-
export declare class
|
|
4
|
+
export declare class WatchdogWorker extends Worker {
|
|
5
5
|
protected redisClient: RedisClient;
|
|
6
6
|
protected config: IRequiredConfig;
|
|
7
|
-
|
|
7
|
+
protected logger: ICompatibleLogger;
|
|
8
|
+
constructor(redisClient: RedisClient, config: IRequiredConfig, managed: boolean, logger: ICompatibleLogger);
|
|
8
9
|
work: (cb: ICallback<void>) => void;
|
|
9
10
|
}
|
|
10
|
-
export default
|
|
11
|
+
export default WatchdogWorker;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WatchdogWorker = void 0;
|
|
4
|
+
const consumer_heartbeat_1 = require("../lib/consumer/consumer-heartbeat");
|
|
5
|
+
const redis_smq_common_1 = require("redis-smq-common");
|
|
6
|
+
const consumer_queues_1 = require("../lib/consumer/consumer-queues");
|
|
7
|
+
const message_handler_1 = require("../lib/consumer/consumer-message-handler/message-handler");
|
|
8
|
+
const retry_message_1 = require("../lib/consumer/consumer-message-handler/retry-message");
|
|
9
|
+
class WatchdogWorker extends redis_smq_common_1.Worker {
|
|
10
|
+
constructor(redisClient, config, managed, logger) {
|
|
11
|
+
super(managed);
|
|
12
|
+
this.work = (cb) => {
|
|
13
|
+
consumer_heartbeat_1.ConsumerHeartbeat.getExpiredHeartbeatIds(this.redisClient, (err, reply) => {
|
|
14
|
+
if (err)
|
|
15
|
+
cb(err);
|
|
16
|
+
else {
|
|
17
|
+
const ids = reply !== null && reply !== void 0 ? reply : [];
|
|
18
|
+
if (ids.length) {
|
|
19
|
+
const statuses = [];
|
|
20
|
+
const multi = this.redisClient.multi();
|
|
21
|
+
redis_smq_common_1.async.each(ids, (consumerId, key, callback) => {
|
|
22
|
+
consumer_heartbeat_1.ConsumerHeartbeat.handleExpiredHeartbeatId(consumerId, multi);
|
|
23
|
+
consumer_queues_1.consumerQueues.getConsumerQueues(this.redisClient, consumerId, (err, reply) => {
|
|
24
|
+
if (err)
|
|
25
|
+
callback(err);
|
|
26
|
+
else {
|
|
27
|
+
const queues = reply !== null && reply !== void 0 ? reply : [];
|
|
28
|
+
redis_smq_common_1.async.each(queues, (queue, _, done) => {
|
|
29
|
+
message_handler_1.MessageHandler.cleanUp(this.config, this.redisClient, consumerId, queue, multi, (err, reply) => {
|
|
30
|
+
if (err)
|
|
31
|
+
done(err);
|
|
32
|
+
else {
|
|
33
|
+
statuses.push(reply !== null && reply !== void 0 ? reply : false);
|
|
34
|
+
done();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}, callback);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}, (err) => {
|
|
41
|
+
if (err)
|
|
42
|
+
cb(err);
|
|
43
|
+
else {
|
|
44
|
+
multi.exec((err) => {
|
|
45
|
+
if (err)
|
|
46
|
+
cb(err);
|
|
47
|
+
else {
|
|
48
|
+
statuses.forEach((cleanUpStatus) => {
|
|
49
|
+
if (cleanUpStatus) {
|
|
50
|
+
this.logger.debug(`Message ID ${cleanUpStatus.message.getId()} has been ${cleanUpStatus.status ===
|
|
51
|
+
retry_message_1.ERetryStatus.MESSAGE_DEAD_LETTERED
|
|
52
|
+
? 'dead-lettered'
|
|
53
|
+
: 'unacknowledged'}.`);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
cb();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
cb();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
this.redisClient = redisClient;
|
|
68
|
+
this.config = config;
|
|
69
|
+
this.logger = logger;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.WatchdogWorker = WatchdogWorker;
|
|
73
|
+
exports.default = WatchdogWorker;
|
|
74
|
+
//# sourceMappingURL=watchdog.worker.js.map
|
package/dist/types/index.d.ts
CHANGED
|
@@ -56,9 +56,9 @@ export declare enum EMessageDeadLetterCause {
|
|
|
56
56
|
}
|
|
57
57
|
export declare enum EMessageUnacknowledgedCause {
|
|
58
58
|
TIMEOUT = "timeout",
|
|
59
|
-
|
|
59
|
+
CONSUME_ERROR = "consumer_error",
|
|
60
60
|
UNACKNOWLEDGED = "unacknowledged",
|
|
61
|
-
|
|
61
|
+
OFFLINE_CONSUMER = "offline_consumer",
|
|
62
62
|
TTL_EXPIRED = "ttl_expired"
|
|
63
63
|
}
|
|
64
64
|
export declare type TQueueParams = {
|
package/dist/types/index.js
CHANGED
|
@@ -10,9 +10,9 @@ var EMessageDeadLetterCause;
|
|
|
10
10
|
var EMessageUnacknowledgedCause;
|
|
11
11
|
(function (EMessageUnacknowledgedCause) {
|
|
12
12
|
EMessageUnacknowledgedCause["TIMEOUT"] = "timeout";
|
|
13
|
-
EMessageUnacknowledgedCause["
|
|
13
|
+
EMessageUnacknowledgedCause["CONSUME_ERROR"] = "consumer_error";
|
|
14
14
|
EMessageUnacknowledgedCause["UNACKNOWLEDGED"] = "unacknowledged";
|
|
15
|
-
EMessageUnacknowledgedCause["
|
|
15
|
+
EMessageUnacknowledgedCause["OFFLINE_CONSUMER"] = "offline_consumer";
|
|
16
16
|
EMessageUnacknowledgedCause["TTL_EXPIRED"] = "ttl_expired";
|
|
17
17
|
})(EMessageUnacknowledgedCause = exports.EMessageUnacknowledgedCause || (exports.EMessageUnacknowledgedCause = {}));
|
|
18
18
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "redis-smq",
|
|
3
|
-
"version": "7.0.0-rc.
|
|
3
|
+
"version": "7.0.0-rc.7",
|
|
4
4
|
"description": "A simple high-performance Redis message queue for Node.js.",
|
|
5
5
|
"author": "Weyoss <weyoss@protonmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"bluebird": "3.7.2",
|
|
37
37
|
"cron-parser": "3.5.0",
|
|
38
38
|
"lodash": "4.17.21",
|
|
39
|
-
"redis-smq-common": "1.0.0-rc.
|
|
39
|
+
"redis-smq-common": "1.0.0-rc.11",
|
|
40
40
|
"uuid": "8.3.2"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { EMessageDeadLetterCause, EMessageUnacknowledgedCause, IRequiredConfig } from '../../../types';
|
|
2
|
-
import { Message } from '../message/message';
|
|
3
|
-
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
4
|
-
import { RedisClient } from 'redis-smq-common';
|
|
5
|
-
export declare function retryMessage(config: IRequiredConfig, mixed: IRedisClientMulti, processingQueue: string, message: Message, unacknowledgedCause: EMessageUnacknowledgedCause): EMessageDeadLetterCause | void;
|
|
6
|
-
export declare function retryMessage(config: IRequiredConfig, mixed: RedisClient, processingQueue: string, message: Message, unacknowledgedCause: EMessageUnacknowledgedCause, cb: ICallback<EMessageDeadLetterCause | void>): void;
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { IRequiredConfig } from '../../../types';
|
|
2
|
-
import { ICallback, IRedisClientMulti } from 'redis-smq-common/dist/types';
|
|
3
|
-
import { RedisClient } from 'redis-smq-common';
|
|
4
|
-
export declare function handleOfflineConsumer(config: IRequiredConfig, multi: IRedisClientMulti, redisClient: RedisClient, consumerId: string, cb: ICallback<void>): void;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleOfflineConsumer = void 0;
|
|
4
|
-
const redis_smq_common_1 = require("redis-smq-common");
|
|
5
|
-
const consumer_queues_1 = require("./consumer-queues");
|
|
6
|
-
const message_handler_1 = require("./consumer-message-handler/message-handler");
|
|
7
|
-
function handleOfflineConsumer(config, multi, redisClient, consumerId, cb) {
|
|
8
|
-
redis_smq_common_1.async.waterfall([
|
|
9
|
-
(cb) => consumer_queues_1.consumerQueues.getConsumerQueues(redisClient, consumerId, cb),
|
|
10
|
-
(queues, cb) => {
|
|
11
|
-
redis_smq_common_1.async.each(queues, (queue, _, done) => {
|
|
12
|
-
message_handler_1.MessageHandler.cleanUp(config, redisClient, consumerId, queue, multi, done);
|
|
13
|
-
}, cb);
|
|
14
|
-
},
|
|
15
|
-
], cb);
|
|
16
|
-
}
|
|
17
|
-
exports.handleOfflineConsumer = handleOfflineConsumer;
|
|
18
|
-
//# sourceMappingURL=offline-consumers.js.map
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HeartbeatMonitorWorker = void 0;
|
|
4
|
-
const consumer_heartbeat_1 = require("../lib/consumer/consumer-heartbeat");
|
|
5
|
-
const redis_smq_common_1 = require("redis-smq-common");
|
|
6
|
-
class HeartbeatMonitorWorker extends redis_smq_common_1.Worker {
|
|
7
|
-
constructor(redisClient, config, managed) {
|
|
8
|
-
super(managed);
|
|
9
|
-
this.work = (cb) => {
|
|
10
|
-
redis_smq_common_1.async.waterfall([
|
|
11
|
-
(cb) => consumer_heartbeat_1.ConsumerHeartbeat.getExpiredHeartbeatIds(this.redisClient, cb),
|
|
12
|
-
(consumerIds, cb) => {
|
|
13
|
-
consumer_heartbeat_1.ConsumerHeartbeat.handleExpiredHeartbeatIds(this.config, this.redisClient, consumerIds, cb);
|
|
14
|
-
},
|
|
15
|
-
], cb);
|
|
16
|
-
};
|
|
17
|
-
this.redisClient = redisClient;
|
|
18
|
-
this.config = config;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
exports.HeartbeatMonitorWorker = HeartbeatMonitorWorker;
|
|
22
|
-
exports.default = HeartbeatMonitorWorker;
|
|
23
|
-
//# sourceMappingURL=heartbeat-monitor.worker.js.map
|