ssut / nestjs-sqs

A project to make SQS easier to use within NestJS, with decorator-based handling and seamless NestJS-way integration.
MIT License
204 stars 54 forks source link

SQS receive message failed: AWS SDK error wrapper for TimeoutError: socket hang up #68

Closed sosafe-steven-snoeijen closed 11 months ago

sosafe-steven-snoeijen commented 11 months ago

Hi,

I am currently getting the following error:

/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/errors.js:40
    const sqsError = new SQSError(message);
                     ^
Error [ERR_UNHANDLED_ERROR]: Unhandled error. (SQSError: SQS receive message failed: AWS SDK error wrapper for TimeoutError: socket hang up
    at toSQSError (/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/errors.js:40:22)
    at Consumer.receiveMessage (/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/consumer.js:173:43)
    at processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'Error',
  statusCode: undefined,
  retryable: undefined,
  service: undefined,
  fault: undefined,
  time: 2023-10-13T12:59:35.696Z
})
    at new NodeError (node:internal/errors:393:5)
    at Consumer.emit (node:events:502:17)
    at Consumer.emit (node:domain:489:12)
    at Consumer.emit (/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/emitter.js:29:22)
    at Consumer.emitError (/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/consumer.js:111:18)
    at /home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/consumer.js:145:18
    at processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'ERR_UNHANDLED_ERROR',
  context: SQSError: SQS receive message failed: AWS SDK error wrapper for TimeoutError: socket hang up
      at toSQSError (/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/errors.js:40:22)
      at Consumer.receiveMessage (/home/steven/repos/be-ms-personalized-learning/node_modules/sqs-consumer/dist/consumer.js:173:43)
      at processTicksAndRejections (node:internal/process/task_queues:95:5) {
    code: 'Error',
    statusCode: undefined,
    retryable: undefined,
    service: undefined,
    fault: undefined,
    time: 2023-10-13T12:59:35.696Z
  }
}

To give some context. This error is being thrown in a jest test (29.5.0). This test is setting up localstack (mocking sqs) is using node testcontainers (9.8.0) with docker image localstack/localstack:2.1.0 in jest's globalSetup and globalTeardown.

The SqsModule's consumer is working correctly, as I see this in the checks in the test. Also the tests do all succeed, when jest finished the tests.

But when jest is closing fully (globalTeardown, so stopping localstack), the sqs-consumer seems to be still polling for messages, resulting in the error mentioned above.

When removing the localstack stop from the globalTeardown script, the test wont error. But jest is never closed as processes stay open.

I am not sure if the problem is in this library or within sqs-consumer... Please let me know if you need more context to the problem to better understand.

Thanks!

sosafe-steven-snoeijen commented 11 months ago

After some diffing I tried using the property waitTimeSecond: 0, I do not fully understand but I expect that the long-polling of the queue stays open after the nestjs server is stopped. Resulting in the error. Setting it to 0 (short-polling) will close the consumer directly fixing the problem :)

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html