@cargolift-cdi/util-rabbitmq 0.2.18 → 0.2.20
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.
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
interface RabbitMQTopologyRetry {
|
|
2
|
+
short: string;
|
|
3
|
+
long: string;
|
|
4
|
+
}
|
|
5
|
+
export interface RabbitMQTopology {
|
|
6
|
+
exchange: string;
|
|
7
|
+
type: string;
|
|
8
|
+
queues: RabbitMQTopologyQueue[];
|
|
9
|
+
alternateExchange?: {
|
|
10
|
+
exchange: string;
|
|
11
|
+
queue: string;
|
|
12
|
+
};
|
|
13
|
+
deadLetterExchange: {
|
|
14
|
+
exchange: string;
|
|
15
|
+
};
|
|
16
|
+
retry: {
|
|
17
|
+
exchanges: RabbitMQTopologyRetry;
|
|
18
|
+
policy_short_ms: number;
|
|
19
|
+
policy_long_ms: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface RabbitMQTopologyQueue {
|
|
23
|
+
queue: string;
|
|
24
|
+
routingKey: string;
|
|
25
|
+
deadLetterQueue: {
|
|
26
|
+
name: string;
|
|
27
|
+
routingKey: string;
|
|
28
|
+
};
|
|
29
|
+
retryQueues: RabbitMQTopologyRetry;
|
|
30
|
+
}
|
|
1
31
|
/**
|
|
2
32
|
* RabbitMQTopologyService
|
|
3
33
|
* Padroniza criação de exchanges, DLX, AE e filas dinâmicas por sistema.
|
|
@@ -6,12 +36,13 @@
|
|
|
6
36
|
export declare class RabbitMQTopologyService {
|
|
7
37
|
private readonly logger;
|
|
8
38
|
/**
|
|
9
|
-
* Cria exchanges
|
|
39
|
+
* Cria exchanges, AE (fanout), DLX (topic), unrouteable queue e exchanges de retry (inbound).
|
|
10
40
|
*/
|
|
11
|
-
setupBaseTopology(): Promise<void>;
|
|
41
|
+
setupBaseTopology(topology: RabbitMQTopology): Promise<void>;
|
|
12
42
|
/**
|
|
13
43
|
* Cria filas por sistema e faz binds necessários. Para inbound, cria filas de retry com TTLs.
|
|
14
44
|
*/
|
|
15
|
-
setupQueue(
|
|
45
|
+
setupQueue(topology: RabbitMQTopology): Promise<string>;
|
|
16
46
|
}
|
|
47
|
+
export {};
|
|
17
48
|
//# sourceMappingURL=rabbitmq-topology.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-topology.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,qBACa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IAEnE;;OAEG;IACG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"rabbitmq-topology.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,kBAAkB,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,KAAK,EAAE;QACL,SAAS,EAAE,qBAAqB,CAAC;QACjC,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CAGH;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,EAAE,qBAAqB,CAAC;CACpC;AAED;;;;GAIG;AACH,qBACa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IAEnE;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6ClE;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CAkE9D"}
|
|
@@ -5,8 +5,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
var RabbitMQTopologyService_1;
|
|
8
|
-
import { Injectable, Logger } from
|
|
9
|
-
import { getRabbitConnectionManager } from
|
|
8
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
9
|
+
import { getRabbitConnectionManager } from "./rabbitmq-connection.manager.js";
|
|
10
10
|
/**
|
|
11
11
|
* RabbitMQTopologyService
|
|
12
12
|
* Padroniza criação de exchanges, DLX, AE e filas dinâmicas por sistema.
|
|
@@ -17,34 +17,39 @@ let RabbitMQTopologyService = RabbitMQTopologyService_1 = class RabbitMQTopology
|
|
|
17
17
|
this.logger = new Logger(RabbitMQTopologyService_1.name);
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* Cria exchanges
|
|
20
|
+
* Cria exchanges, AE (fanout), DLX (topic), unrouteable queue e exchanges de retry (inbound).
|
|
21
21
|
*/
|
|
22
|
-
async setupBaseTopology() {
|
|
22
|
+
async setupBaseTopology(topology) {
|
|
23
23
|
const ch = await getRabbitConnectionManager().createChannel();
|
|
24
24
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
25
|
+
// Alternate Exchange (inbound.ae)
|
|
26
|
+
if (topology.alternateExchange) {
|
|
27
|
+
await ch.assertExchange(topology.alternateExchange.exchange, "fanout", { durable: true });
|
|
28
|
+
}
|
|
29
|
+
// Dead Letter Exchange (inbound.dlx)
|
|
30
|
+
if (topology.deadLetterExchange) {
|
|
31
|
+
await ch.assertExchange(topology.deadLetterExchange.exchange, "topic", { durable: true });
|
|
32
|
+
}
|
|
33
|
+
// Exchanges de retry (topic) para inbound (inbound.retry.short/long)
|
|
34
|
+
if (topology.retry?.exchanges) {
|
|
35
|
+
await ch.assertExchange(topology.retry.exchanges.short, "topic", { durable: true });
|
|
36
|
+
await ch.assertExchange(topology.retry.exchanges.long, "topic", { durable: true });
|
|
37
|
+
}
|
|
38
|
+
// Exchanges principais (topic) com AE (inbound)
|
|
39
|
+
await ch.assertExchange(topology.exchange, "topic", {
|
|
40
|
+
durable: true,
|
|
41
|
+
arguments: {
|
|
42
|
+
"alternate-exchange": topology.alternateExchange?.exchange || "",
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
// Alternate queues bound to AE
|
|
46
|
+
if (topology.alternateExchange) {
|
|
47
|
+
await ch.assertQueue(topology.alternateExchange.queue, { durable: true });
|
|
48
|
+
await ch.bindQueue(topology.alternateExchange.queue, topology.alternateExchange.exchange, "");
|
|
49
|
+
}
|
|
50
|
+
this.logger.log(`[RABBITMQ] Topology => exchange: ${topology.exchange} ` +
|
|
51
|
+
(topology.alternateExchange ? ` | AE: ${topology.alternateExchange.exchange}` : "") +
|
|
52
|
+
(topology.deadLetterExchange ? ` | DLX: ${topology.deadLetterExchange.exchange}` : ""));
|
|
48
53
|
}
|
|
49
54
|
finally {
|
|
50
55
|
try {
|
|
@@ -56,60 +61,53 @@ let RabbitMQTopologyService = RabbitMQTopologyService_1 = class RabbitMQTopology
|
|
|
56
61
|
/**
|
|
57
62
|
* Cria filas por sistema e faz binds necessários. Para inbound, cria filas de retry com TTLs.
|
|
58
63
|
*/
|
|
59
|
-
async setupQueue(
|
|
64
|
+
async setupQueue(topology) {
|
|
60
65
|
const ch = await getRabbitConnectionManager().createChannel();
|
|
61
66
|
try {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
});
|
|
78
|
-
await ch.bindQueue(queueName, exchange, routing);
|
|
79
|
-
await ch.bindQueue(`${exchange}.${system}.dlq`, `${exchange}.${dlx}`, `integration.${system}.#`);
|
|
80
|
-
if (way === 'inbound') {
|
|
81
|
-
const retryShortQueue = `${exchange}.${system}.retry.short`;
|
|
82
|
-
const retryLongQueue = `${exchange}.${system}.retry.long`;
|
|
67
|
+
for (const queue of topology.queues) {
|
|
68
|
+
// Dead Letter Queue (inbound.sistema.dlq)
|
|
69
|
+
await ch.assertQueue(queue.deadLetterQueue.name, { durable: true });
|
|
70
|
+
// Fila principal (inbound.sistema)
|
|
71
|
+
// x-dead-letter-exchange: (inbound.dlx)
|
|
72
|
+
// x-dead-letter-routing-key: (integration.sistema.dead)
|
|
73
|
+
await ch.assertQueue(queue.queue, {
|
|
74
|
+
durable: true,
|
|
75
|
+
arguments: {
|
|
76
|
+
"x-dead-letter-exchange": topology.deadLetterExchange?.exchange,
|
|
77
|
+
"x-dead-letter-routing-key": queue.deadLetterQueue?.routingKey,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
await ch.bindQueue(queue.queue, topology.exchange, queue.routingKey);
|
|
81
|
+
await ch.bindQueue(queue.deadLetterQueue.name, topology.deadLetterExchange.exchange, queue.deadLetterQueue.routingKey);
|
|
83
82
|
try {
|
|
84
|
-
await ch.assertQueue(
|
|
83
|
+
await ch.assertQueue(queue.retryQueues.short, {
|
|
85
84
|
durable: true,
|
|
86
85
|
arguments: {
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
"x-message-ttl": topology.retry.policy_short_ms,
|
|
87
|
+
"x-dead-letter-exchange": topology.exchange,
|
|
89
88
|
},
|
|
90
89
|
});
|
|
91
|
-
await ch.assertQueue(
|
|
90
|
+
await ch.assertQueue(queue.retryQueues.long, {
|
|
92
91
|
durable: true,
|
|
93
92
|
arguments: {
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
"x-message-ttl": topology.retry.policy_long_ms,
|
|
94
|
+
"x-dead-letter-exchange": topology.exchange,
|
|
96
95
|
},
|
|
97
96
|
});
|
|
98
97
|
}
|
|
99
98
|
catch (e) {
|
|
100
|
-
const msg = String(e?.message ?? e ??
|
|
99
|
+
const msg = String(e?.message ?? e ?? "");
|
|
101
100
|
if (/PRECONDITION[_-]FAILED|inequivalent arg/i.test(msg)) {
|
|
102
101
|
// Sinaliza claramente drift de topologia
|
|
103
|
-
throw new Error(`RabbitMQ topology drift: ${msg}. Filas de retry existentes para '${
|
|
102
|
+
throw new Error(`RabbitMQ topology drift: ${msg}. Filas de retry existentes para '${queue.queue}' com TTL/args diferentes dos configurados. Alinhe variáveis ou remova filas manualmente.`);
|
|
104
103
|
}
|
|
105
104
|
throw e;
|
|
106
105
|
}
|
|
107
|
-
await ch.bindQueue(
|
|
108
|
-
await ch.bindQueue(
|
|
106
|
+
await ch.bindQueue(queue.retryQueues.short, topology.retry.exchanges.short, queue.routingKey);
|
|
107
|
+
await ch.bindQueue(queue.retryQueues.long, topology.retry.exchanges.long, queue.routingKey);
|
|
108
|
+
this.logger.log(`[RABBITMQ] Queue ready: ${queue.queue} | DLQ: ${queue.deadLetterQueue.name} | exchange: ${topology.exchange} | bind: ${queue.routingKey}`);
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
(way === 'inbound' ? ` | retries: ${exchange}.${system}.retry.short, ${exchange}.${system}.retry.long` : ''));
|
|
112
|
-
return queueName;
|
|
110
|
+
return "topology.queue";
|
|
113
111
|
}
|
|
114
112
|
finally {
|
|
115
113
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-topology.service.js","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"rabbitmq-topology.service.js","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":"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"}
|