@cargolift-cdi/util-rabbitmq 0.2.46 → 0.2.47
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,mBA4JhF"}
|
|
@@ -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";
|
|
@@ -67,14 +67,14 @@ export function createDefaultMessageHandler(opts) {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
catch (error) {
|
|
70
|
-
const
|
|
71
|
-
if (
|
|
70
|
+
const errorClassification = classifyError(error);
|
|
71
|
+
if (errorClassification === "application" || errorClassification === "business") {
|
|
72
72
|
const scheduled = scheduleTransientRetry(channel, msg, opts.loggerContext, {
|
|
73
73
|
inboundExchange: opts.exchange,
|
|
74
74
|
});
|
|
75
75
|
if (scheduled.success) {
|
|
76
76
|
if (opts.processor.onRetry) {
|
|
77
|
-
await opts.processor.onRetry(error?.message, error?.cause || undefined, error?.stack || undefined,
|
|
77
|
+
await opts.processor.onRetry(error?.message, error?.cause || undefined, error?.stack || undefined, errorClassification);
|
|
78
78
|
}
|
|
79
79
|
opts.loggerContext.warn(`[${queueName}] Erro transiente: ${error.message}. [Agendando nova tentativa ${scheduled.currentRetry}/${scheduled.maxRetries}. Fila: ${scheduled.queue}]`, {
|
|
80
80
|
data: {
|
|
@@ -86,7 +86,7 @@ export function createDefaultMessageHandler(opts) {
|
|
|
86
86
|
error: {
|
|
87
87
|
message: error?.toString() || String(error),
|
|
88
88
|
cause: error?.cause || undefined,
|
|
89
|
-
type:
|
|
89
|
+
type: errorClassification,
|
|
90
90
|
},
|
|
91
91
|
});
|
|
92
92
|
return;
|
|
@@ -101,39 +101,38 @@ export function createDefaultMessageHandler(opts) {
|
|
|
101
101
|
opts.loggerContext.error(`[${queueName}] Não foi possível derivar o sistema a partir do nome da fila '${queueName}'. Fallback para nack(false).`);
|
|
102
102
|
}
|
|
103
103
|
let msgAction;
|
|
104
|
-
switch (
|
|
105
|
-
case "
|
|
104
|
+
switch (errorClassification) {
|
|
105
|
+
case "business_fatal":
|
|
106
106
|
msgAction = `${error.message} [Erro fatal de negócio, encaminhando para DLQ.]`;
|
|
107
107
|
break;
|
|
108
|
-
case "
|
|
108
|
+
case "application_fatal":
|
|
109
109
|
msgAction = `${error.message} [Erro fatal, encaminhando para DLQ.]`;
|
|
110
110
|
break;
|
|
111
111
|
default:
|
|
112
112
|
msgAction = `${error.message} [Todas tentativas falharam, encaminhando para DLQ.]`;
|
|
113
113
|
}
|
|
114
|
-
if (errorType === "
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
114
|
+
//if (errorType === "business_fatal" || errorType === "application_fatal") {
|
|
115
|
+
if (opts.processor.onError) {
|
|
116
|
+
await opts.processor.onError(msgAction, error?.cause || undefined, error?.stack || undefined, errorClassification);
|
|
118
117
|
}
|
|
119
|
-
else {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
error: {
|
|
131
|
-
message: error?.toString() || String(error),
|
|
132
|
-
cause: error?.cause || undefined,
|
|
133
|
-
type: errorType,
|
|
118
|
+
//} else {
|
|
119
|
+
opts.loggerContext.warn(`[${queueName}] ${msgAction}`, {
|
|
120
|
+
data: {
|
|
121
|
+
rabbit: {
|
|
122
|
+
exchange: dlxExchange,
|
|
123
|
+
routing_key: dlqRoutingKey,
|
|
124
|
+
system,
|
|
125
|
+
event,
|
|
126
|
+
action,
|
|
134
127
|
},
|
|
135
|
-
}
|
|
136
|
-
|
|
128
|
+
},
|
|
129
|
+
error: {
|
|
130
|
+
message: error?.toString() || String(error),
|
|
131
|
+
cause: error?.cause || undefined,
|
|
132
|
+
type: errorClassification,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
//}
|
|
137
136
|
try {
|
|
138
137
|
publishToDlqAndAck(channel, msg, opts.loggerContext, error, dlxExchange, dlqRoutingKey, {
|
|
139
138
|
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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"}
|