@cargolift-cdi/util-rabbitmq 0.2.46 → 0.2.49
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,6 +1,7 @@
|
|
|
1
1
|
import { Channel, ConsumeMessage } from "amqplib";
|
|
2
2
|
import { Logger } from "@nestjs/common";
|
|
3
3
|
import { LoggerContextService } from "@cargolift-cdi/common";
|
|
4
|
+
import { ErrorClassification } from "@cargolift-cdi/types";
|
|
4
5
|
export interface MessageProcessor {
|
|
5
6
|
system: string | undefined;
|
|
6
7
|
event: string | undefined;
|
|
@@ -19,8 +20,8 @@ export interface DefaultHandlerOptions {
|
|
|
19
20
|
processor: {
|
|
20
21
|
process: (messageProcessor: MessageProcessor) => Promise<void>;
|
|
21
22
|
onSuccess: (message: string) => Promise<void>;
|
|
22
|
-
onRetry: (message: string, detail: string, stack?: string, errorClassification?:
|
|
23
|
-
onError: (message: string, detail: string, stack?: string, errorClassification?:
|
|
23
|
+
onRetry: (message: string, detail: string, stack?: string, errorClassification?: ErrorClassification) => Promise<void>;
|
|
24
|
+
onError: (message: string, detail: string, stack?: string, errorClassification?: ErrorClassification) => Promise<void>;
|
|
24
25
|
};
|
|
25
26
|
dlxSuffixEnvVar?: string;
|
|
26
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-message.handlers.d.ts","sourceRoot":"","sources":["../src/rabbitmq-message.handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAKL,oBAAoB,EAErB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"rabbitmq-message.handlers.d.ts","sourceRoot":"","sources":["../src/rabbitmq-message.handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAKL,oBAAoB,EAErB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAa,MAAM,sBAAsB,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,oBAAoB,CAAC;IACpC,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/D,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACvH,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxH,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAUD,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;;;;;;EAaA;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,IACvD,KAAK;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,mBA0LhF"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { ApplicationError, ApplicationFatalError, BusinessError, BusinessFatalError, runWithLoggerContext, } from "@cargolift-cdi/common";
|
|
2
2
|
import { publishToDlqAndAck, scheduleTransientRetry } from "./index.js";
|
|
3
3
|
function classifyError(error) {
|
|
4
|
-
if (error instanceof ApplicationFatalError
|
|
5
|
-
return "
|
|
4
|
+
if (error instanceof ApplicationFatalError)
|
|
5
|
+
return "application_fatal";
|
|
6
|
+
if (error instanceof BusinessFatalError)
|
|
7
|
+
return "business_fatal";
|
|
6
8
|
if (error instanceof ApplicationError)
|
|
7
|
-
return "
|
|
9
|
+
return "application";
|
|
8
10
|
if (error instanceof BusinessError)
|
|
9
|
-
return "
|
|
10
|
-
|
|
11
|
-
return "fatal";
|
|
12
|
-
return "transient";
|
|
11
|
+
return "business";
|
|
12
|
+
return "application_fatal";
|
|
13
13
|
}
|
|
14
14
|
export function buildDlqInfo(params) {
|
|
15
15
|
const dlxSuffix = params.dlxSuffix ?? process.env.RABBITMQ_EXCHANGE_DLX ?? "dlx";
|
|
@@ -50,6 +50,7 @@ export function createDefaultMessageHandler(opts) {
|
|
|
50
50
|
payload: msg.content.toString("utf8"),
|
|
51
51
|
},
|
|
52
52
|
});
|
|
53
|
+
// Processa a mensagem usando o processador
|
|
53
54
|
await opts.processor.process({
|
|
54
55
|
system,
|
|
55
56
|
event,
|
|
@@ -61,20 +62,26 @@ export function createDefaultMessageHandler(opts) {
|
|
|
61
62
|
routingKey,
|
|
62
63
|
retries,
|
|
63
64
|
});
|
|
65
|
+
// Acknowledges a mensagem após processamento bem-sucedido
|
|
64
66
|
channel.ack(msg);
|
|
67
|
+
// Chama onSuccess no processador da fila
|
|
65
68
|
if (opts.processor.onSuccess) {
|
|
66
69
|
await opts.processor.onSuccess(`Mensagem processada com sucesso.`);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
72
|
catch (error) {
|
|
70
|
-
const
|
|
71
|
-
|
|
73
|
+
const errorClassification = classifyError(error);
|
|
74
|
+
// -----------------------------------------------------------
|
|
75
|
+
// Agendamento de retry para erros transientes (application e business)
|
|
76
|
+
// -----------------------------------------------------------
|
|
77
|
+
if (errorClassification === "application" || errorClassification === "business") {
|
|
72
78
|
const scheduled = scheduleTransientRetry(channel, msg, opts.loggerContext, {
|
|
73
79
|
inboundExchange: opts.exchange,
|
|
74
80
|
});
|
|
75
81
|
if (scheduled.success) {
|
|
82
|
+
// Chama onRetry no processador da fila
|
|
76
83
|
if (opts.processor.onRetry) {
|
|
77
|
-
await opts.processor.onRetry(error?.message, error?.cause || undefined, error?.stack || undefined,
|
|
84
|
+
await opts.processor.onRetry(error?.message, error?.cause || undefined, error?.stack || undefined, errorClassification);
|
|
78
85
|
}
|
|
79
86
|
opts.loggerContext.warn(`[${queueName}] Erro transiente: ${error.message}. [Agendando nova tentativa ${scheduled.currentRetry}/${scheduled.maxRetries}. Fila: ${scheduled.queue}]`, {
|
|
80
87
|
data: {
|
|
@@ -86,12 +93,16 @@ export function createDefaultMessageHandler(opts) {
|
|
|
86
93
|
error: {
|
|
87
94
|
message: error?.toString() || String(error),
|
|
88
95
|
cause: error?.cause || undefined,
|
|
89
|
-
type:
|
|
96
|
+
type: errorClassification,
|
|
90
97
|
},
|
|
91
98
|
});
|
|
92
99
|
return;
|
|
93
100
|
}
|
|
94
101
|
}
|
|
102
|
+
// -----------------------------------------------------------
|
|
103
|
+
// Se não for possível agendar retry, envia para DLQ
|
|
104
|
+
// -----------------------------------------------------------
|
|
105
|
+
// Deriva informações da DLQ
|
|
95
106
|
const { dlxExchange, dlqRoutingKey, system, event, action } = buildDlqInfo({
|
|
96
107
|
baseExchange: opts.exchange,
|
|
97
108
|
queueName,
|
|
@@ -101,23 +112,41 @@ export function createDefaultMessageHandler(opts) {
|
|
|
101
112
|
opts.loggerContext.error(`[${queueName}] Não foi possível derivar o sistema a partir do nome da fila '${queueName}'. Fallback para nack(false).`);
|
|
102
113
|
}
|
|
103
114
|
let msgAction;
|
|
104
|
-
switch (
|
|
105
|
-
case "
|
|
115
|
+
switch (errorClassification) {
|
|
116
|
+
case "business_fatal":
|
|
106
117
|
msgAction = `${error.message} [Erro fatal de negócio, encaminhando para DLQ.]`;
|
|
107
118
|
break;
|
|
108
|
-
case "
|
|
119
|
+
case "application_fatal":
|
|
109
120
|
msgAction = `${error.message} [Erro fatal, encaminhando para DLQ.]`;
|
|
110
121
|
break;
|
|
111
122
|
default:
|
|
112
123
|
msgAction = `${error.message} [Todas tentativas falharam, encaminhando para DLQ.]`;
|
|
113
124
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
125
|
+
// Chama onError no processador da fila antes de publicar na DLQ
|
|
126
|
+
if (opts.processor.onError) {
|
|
127
|
+
await opts.processor.onError(msgAction, error?.cause || undefined, error?.stack || undefined, errorClassification);
|
|
128
|
+
}
|
|
129
|
+
// Loga o erro antes de enviar para DLQ
|
|
130
|
+
if (errorClassification === "business" || errorClassification === "business_fatal") {
|
|
131
|
+
opts.loggerContext.businessError(`[${queueName}] ${msgAction}`, {
|
|
132
|
+
data: {
|
|
133
|
+
rabbit: {
|
|
134
|
+
exchange: dlxExchange,
|
|
135
|
+
routing_key: dlqRoutingKey,
|
|
136
|
+
system,
|
|
137
|
+
event,
|
|
138
|
+
action,
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
error: {
|
|
142
|
+
message: error?.toString() || String(error),
|
|
143
|
+
cause: error?.cause || undefined,
|
|
144
|
+
type: errorClassification,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
118
147
|
}
|
|
119
148
|
else {
|
|
120
|
-
opts.loggerContext.
|
|
149
|
+
opts.loggerContext.error(`[${queueName}] ${msgAction}`, {
|
|
121
150
|
data: {
|
|
122
151
|
rabbit: {
|
|
123
152
|
exchange: dlxExchange,
|
|
@@ -130,10 +159,13 @@ export function createDefaultMessageHandler(opts) {
|
|
|
130
159
|
error: {
|
|
131
160
|
message: error?.toString() || String(error),
|
|
132
161
|
cause: error?.cause || undefined,
|
|
133
|
-
type:
|
|
162
|
+
type: errorClassification,
|
|
134
163
|
},
|
|
135
164
|
});
|
|
136
165
|
}
|
|
166
|
+
// -----------------------------------------------------------
|
|
167
|
+
// Publica na DLQ
|
|
168
|
+
// -----------------------------------------------------------
|
|
137
169
|
try {
|
|
138
170
|
publishToDlqAndAck(channel, msg, opts.loggerContext, error, dlxExchange, dlqRoutingKey, {
|
|
139
171
|
noLoggerError: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-message.handlers.js","sourceRoot":"","sources":["../src/rabbitmq-message.handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAElB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAkB,sBAAsB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"rabbitmq-message.handlers.js","sourceRoot":"","sources":["../src/rabbitmq-message.handlers.ts"],"names":[],"mappings":"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"}
|