moleculerjs / moleculer-channels

Reliable messages for Moleculer services via external queue/channel/topic.
MIT License
75 stars 15 forks source link

AMQP: DEAD_LETTER exchange needs to be asserted #67

Closed ujwal-setlur closed 1 year ago

ujwal-setlur commented 1 year ago

Prerequisites

Please answer the following questions for yourself before submitting an issue.

Current Behavior

When a message is tried to be moved to the dead-letter exchange/queue, that delivery fails and the channel closes because the exchange does not exist.

Expected Behavior

The dead-letter exchange/queue should be asserted into existence so that the message can be moved into the queue.

Failure Information

mol $ [2023-03-22T16:54:03.534Z] WARN  @txtsmarter/transformer-triloka-92/CHANNELS: AMQP message processing error in 'transformer.imessage' queue. Error: NOT ACCEPTED!
    at TransformerService.transformer.imessage (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/packages/services/transformer/src/transformer.service.ts:67:11)
    at TransformerService.<anonymous> (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/moleculer@0.14.29_o6qzvejtzsnpaf7pu7pwc3mpbq/node_modules/moleculer/src/utils.js:212:22)
    at checkAuth (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/packages/services/transformer/src/middlewares/moleculer.auth.middleware.ts:76:18)
    at emitESEvent (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/packages/services/transformer/src/middlewares/moleculer.eventstore.middleware.ts:76:16)
    at logMessage (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/packages/services/transformer/src/middlewares/moleculer.log.middleware.ts:168:16)
    at wrappedHandler (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/github.com+moleculerjs+moleculer-channels@8f248f029d8cda9be592f0bb3fa0390fadd79a1a_moleculer@0.14.29/node_modules/@moleculer/channels/src/index.js:320:16)
    at Object.chan.handler (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/github.com+moleculerjs+moleculer-channels@8f248f029d8cda9be592f0bb3fa0390fadd79a1a_moleculer@0.14.29/node_modules/@moleculer/channels/src/index.js:336:16)
    at /Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/github.com+moleculerjs+moleculer-channels@8f248f029d8cda9be592f0bb3fa0390fadd79a1a_moleculer@0.14.29/node_modules/@moleculer/channels/src/adapters/amqp.js:365:16
    at Channel.BaseChannel.dispatchMessage (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/amqplib@0.10.3/node_modules/amqplib/lib/channel.js:483:12)
    at Channel.BaseChannel.handleDelivery (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/amqplib@0.10.3/node_modules/amqplib/lib/channel.js:492:15)
[2023-03-22T16:54:03.549Z] ERROR @txtsmarter/transformer-triloka-92/CHANNELS: AMQP channel error Error: Channel closed by server: 404 (NOT-FOUND) with message "NOT_FOUND - no exchange 'DEAD_LETTER' in vhost '/'"
    at Channel.C.accept (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/amqplib@0.10.3/node_modules/amqplib/lib/channel.js:421:17)
    at Connection.mainAccept [as accept] (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/amqplib@0.10.3/node_modules/amqplib/lib/connection.js:63:33)
    at Socket.go (/Users/ujwal/Work/txtsmarter/sw/repos/blackbird/common/temp/node_modules/.pnpm/amqplib@0.10.3/node_modules/amqplib/lib/connection.js:486:48)
    at Socket.emit (node:events:513:28)
    at Socket.emit (node:domain:489:12)
    at emitReadable_ (node:internal/streams/readable:590:12)
    at processTicksAndRejections (node:internal/process/task_queues:81:21) {
  code: 404,
  classId: 60,
  methodId: 40
}
[2023-03-22T16:54:03.551Z] ERROR @txtsmarter/transformer-triloka-92/CHANNELS: AMQP channel closed.

Steps to Reproduce

Please provide detailed steps for reproducing the issue.

  1. set up moleculer channels to have 0 retries, and set up deadLettering:
  2. set up channel handler to throw an exception
  3. publish a message

Reproduce code snippet

broker config:

              maxRetries: 0,
              deadLettering: {
                enabled: true,
                queueName: 'DEAD_LETTER',
                exchangeName: 'DEAD_LETTER'
              },

channel handler:

  async 'transformer.imessage'(
    ctx: CTX<IMessageParams>
  ): Promise<IMessageResponse> {
    throw new Error('NOT ACCEPTED!');

Context

What's even worse is the channel will be closed preventing any further publishing.

I will issue a PR for this soon.