@yolo-croket-dev/core 1.7.17-jun.4 → 1.7.18-slowquery.0

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.
@@ -12,7 +12,6 @@ class BadRequest extends common_1.HttpException {
12
12
  this.errMessage = null;
13
13
  this.errAction = null;
14
14
  this.subMessage = errMessage || null;
15
- console.log('errAction 데이터를 확인합니다.', errAction);
16
15
  // new
17
16
  this.errType = errType || null;
18
17
  this.errMessage = errMessage || null;
@@ -58,7 +58,6 @@ class AmqpManagement {
58
58
  return result.data;
59
59
  }
60
60
  catch (err) {
61
- console.log('call-manager function err 데이터를 확인합니다.', err);
62
61
  msaLogger.error(`ThrowWrapppingCall[${funcName}] error: traceId=${param.traceId}`, { traceId: param.traceId }, { param });
63
62
  if (options && options.isErrorThrowing) {
64
63
  throw err;
@@ -20,7 +20,6 @@ async function AmqpHandler(client, messagePattern, payload) {
20
20
  let data;
21
21
  try {
22
22
  data = await (0, rxjs_1.lastValueFrom)(client.send(messagePattern, payload).pipe());
23
- console.log('data 데이터를 확인합니다.', data);
24
23
  if (data.isError) {
25
24
  const status = data.status || 500;
26
25
  const subMessage = data.subMessage;
@@ -29,7 +28,6 @@ async function AmqpHandler(client, messagePattern, payload) {
29
28
  * 다른 서비스에서 이미 처리가 될 수 있음
30
29
  * */
31
30
  (0, _1.reWriteFileValue)((_a = data === null || data === void 0 ? void 0 : data.arg) === null || _a === void 0 ? void 0 : _a.file);
32
- console.log('data 데이터를 확인합니다. 2', data);
33
31
  const errInfo = data.errInfo ? data.errInfo : {
34
32
  message: data.errMessage,
35
33
  type: data.errType,
@@ -46,7 +44,6 @@ async function AmqpHandler(client, messagePattern, payload) {
46
44
  }
47
45
  }
48
46
  catch (err) {
49
- console.log('err 데이터를 확인합니다.', err);
50
47
  if (typeof err === 'string' && err.includes('There is no matching message handler defined in the remote service.')) {
51
48
  msaLogger.error('NOT_EXISTS_MESSAGE_PATTERN', { traceId: ((_b = payload === null || payload === void 0 ? void 0 : payload.param) === null || _b === void 0 ? void 0 : _b.traceId) || '-' }, { err });
52
49
  throw new HttpExceptionCustom('해당 메시지 패턴은 존재하지 않습니다.', 404, 'There is no matching message handler defined in the remote service.', {
@@ -59,7 +56,6 @@ async function AmqpHandler(client, messagePattern, payload) {
59
56
  throw err;
60
57
  }
61
58
  }
62
- console.log('data를 응답합니다.', data);
63
59
  delete data.isError;
64
60
  return data;
65
61
  }
@@ -42,7 +42,6 @@ async function AmqpPublish(client, messagePattern, payload, message) {
42
42
  clearInterval(unsubscribeInterval);
43
43
  subscribeValue.unsubscribe();
44
44
  const { isError } = value;
45
- console.log('value 데이터를 확인합니다.', value);
46
45
  if (isError) {
47
46
  const result = { ...value };
48
47
  const status = result.status || 500;
@@ -7,6 +7,8 @@ export declare class RPCInterceptor implements NestInterceptor {
7
7
  private readonly gracefulShutdownService;
8
8
  constructor(reflector: Reflector, gracefulShutdownService: GracefulShutdownService);
9
9
  private maxLengthOverShorten;
10
+ /** 메시지가 재전송되었을때에, 재시도 Count가 명시되어 있지 않을때에 처리 할지 여부를 결정하는 함수 */
11
+ isRedeliveryMessage(replyTo: string, traceId: string): Promise<boolean>;
10
12
  private updateMaxLengthArrayShorten;
11
13
  intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<unknown>>;
12
14
  }
@@ -31,6 +31,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
31
31
  var __metadata = (this && this.__metadata) || function (k, v) {
32
32
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
33
  };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
34
37
  Object.defineProperty(exports, "__esModule", { value: true });
35
38
  exports.RPCInterceptor = void 0;
36
39
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -40,6 +43,7 @@ const core_1 = require("@nestjs/core");
40
43
  const rxjs_1 = require("rxjs");
41
44
  const operators_1 = require("rxjs/operators");
42
45
  const msa_logger_1 = __importStar(require("@yolo-croket-dev/msa-logger"));
46
+ const amqplib_1 = __importDefault(require("amqplib"));
43
47
  // import Logger from '@yolo-croket-dev/logger';
44
48
  const functions_1 = require("../functions");
45
49
  const exceptions_1 = require("../exceptions");
@@ -62,6 +66,40 @@ let RPCInterceptor = class RPCInterceptor {
62
66
  }
63
67
  return data;
64
68
  }
69
+ /** 메시지가 재전송되었을때에, 재시도 Count가 명시되어 있지 않을때에 처리 할지 여부를 결정하는 함수 */
70
+ async isRedeliveryMessage(replyTo, traceId) {
71
+ let connection;
72
+ let channel;
73
+ let isRedeliveryProcess = false;
74
+ const AMQP_URL = process.env.AMQP_URL;
75
+ if (!AMQP_URL || !AMQP_URL.length || !replyTo.length) {
76
+ return false;
77
+ }
78
+ try {
79
+ connection = await amqplib_1.default.connect(AMQP_URL);
80
+ channel = await connection.createChannel();
81
+ const isQueueExist = await channel.checkQueue(replyTo);
82
+ if (isQueueExist) {
83
+ isRedeliveryProcess = true;
84
+ }
85
+ await channel.close();
86
+ }
87
+ catch (err) {
88
+ const error = err;
89
+ const logParam = {
90
+ message: error.message,
91
+ stack: error.stack,
92
+ };
93
+ msaLogger.error('isRedeliveryMessage error', { traceId }, logParam);
94
+ isRedeliveryProcess = false;
95
+ }
96
+ finally {
97
+ if (connection) {
98
+ await connection.close();
99
+ }
100
+ }
101
+ return isRedeliveryProcess;
102
+ }
65
103
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
104
  updateMaxLengthArrayShorten(obj, path) {
67
105
  const keys = path.split('.');
@@ -135,7 +173,7 @@ let RPCInterceptor = class RPCInterceptor {
135
173
  // return data;
136
174
  // }
137
175
  async intercept(context, next) {
138
- var _a, _b, _c;
176
+ var _a, _b, _c, _d, _e;
139
177
  const options = this.reflector.get('rpcInterceptorScope', context.getHandler());
140
178
  const args = context.getArgs();
141
179
  const arg = args[0];
@@ -162,7 +200,6 @@ let RPCInterceptor = class RPCInterceptor {
162
200
  return rxjs_1.EMPTY;
163
201
  }
164
202
  if (!staticRetryCount && reDeliveryCount > 0) {
165
- // 직접 메시지가 재시도 처리가 된 경우에는 로그만 남기고 처리하지 않음
166
203
  msaLogger.debug('RETRY_COUNT_ZERO_OR_NO_RETRY 발생 전, redelivery 발생', { traceId: ((_b = content.data.param) === null || _b === void 0 ? void 0 : _b.traceId) || 'RETRY_COUNT_ZERO_OR_NO_RETRY' }, {
167
204
  messagePattern: method,
168
205
  properties: message.properties,
@@ -171,9 +208,22 @@ let RPCInterceptor = class RPCInterceptor {
171
208
  reDeliveryCount,
172
209
  staticRetryCount,
173
210
  });
174
- channel.nack(message, false, false); /** 아마도 기본 30분 타임아웃이 지나고 새로 들어오면 발생할 예정, DLQ로 이동 */
175
- message.properties.replyTo = undefined; /** replyTo가 존재하면 sendToQueue가 호출되므로, 삭제해주기 */
176
- return rxjs_1.EMPTY;
211
+ const isRedeliveryMessage = await this.isRedeliveryMessage(message.properties.replyTo, execInterceptor.traceId);
212
+ if (!isRedeliveryMessage || reDeliveryCount > 5) {
213
+ msaLogger.debug('isRedeliveryMessage RETRY_COUNT_ZERO_OR_NO_RETRY false', { traceId: ((_c = content.data.param) === null || _c === void 0 ? void 0 : _c.traceId) || 'RETRY_COUNT_ZERO_OR_NO_RETRY' });
214
+ channel.sendToQueue(message.properties.replyTo, Buffer.from(JSON.stringify({
215
+ isError: true,
216
+ message: 'RETRY_COUNT_ZERO_OR_NO_RETRY',
217
+ status: 500,
218
+ duration: Date.now() - now,
219
+ arg,
220
+ timestamp: new Date(),
221
+ })), { correlationId: message.properties.correlationId });
222
+ channel.nack(message, false, false); /** 아마도 기본 30분 타임아웃이 지나고 새로 들어오면 발생할 예정, DLQ로 이동 */
223
+ message.properties.replyTo = undefined; /** replyTo가 존재하면 sendToQueue가 호출되므로, 삭제해주기 */
224
+ return new rxjs_1.Observable();
225
+ }
226
+ msaLogger.debug('isRedeliveryMessage RETRY_COUNT_ZERO_OR_NO_RETRY true, 재처리하여 전달토록 하기', { traceId: ((_d = content.data.param) === null || _d === void 0 ? void 0 : _d.traceId) || 'RETRY_COUNT_ZERO_OR_NO_RETRY' });
177
227
  }
178
228
  const noAck = message.fields.routingKey.includes('ASYNC');
179
229
  let localErrorProcessor = async (err) => {
@@ -202,7 +252,6 @@ let RPCInterceptor = class RPCInterceptor {
202
252
  errMessage,
203
253
  errAction,
204
254
  };
205
- console.log('abstractAmqpHandlerData 데이터를 확인합니다.', abstractAmqpHandlerData);
206
255
  if (!Number.isNaN(staticRetryCount)
207
256
  && staticRetryCount
208
257
  && err.isRetry !== false) {
@@ -245,7 +294,7 @@ let RPCInterceptor = class RPCInterceptor {
245
294
  };
246
295
  localErrorProcessor = localErrorProcessor.bind(this);
247
296
  /** 파일 객체 처리 */
248
- (0, functions_1.reWriteFileValue)((_c = content === null || content === void 0 ? void 0 : content.data) === null || _c === void 0 ? void 0 : _c.file);
297
+ (0, functions_1.reWriteFileValue)((_e = content === null || content === void 0 ? void 0 : content.data) === null || _e === void 0 ? void 0 : _e.file);
249
298
  if (options) {
250
299
  if (options.maxLengthKeys && options.maxLengthKeys.length) {
251
300
  for (const key of options.maxLengthKeys) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yolo-croket-dev/core",
3
- "version": "1.7.17-jun.4",
3
+ "version": "1.7.18-slowquery.0",
4
4
  "author": "Yolo Co., Ltd.",
5
5
  "description": "Yolo commonization module",
6
6
  "main": "index.js",