Как сделать http-запрос из сообщения RabbitMQ - nodejs - PullRequest
0 голосов
/ 06 августа 2020
import * as Amqp from "amqp-ts";

const fetch = require('node-fetch');

let connection = new Amqp.Connection("amqp://admin:admin@localhost");
let exchange = connection.declareExchange("ExchangeName");
let queue = connection.declareQueue("nodejs");
queue.bind(exchange);
queue.activateConsumer(async (message) => {
  const site: string = message.getContent().site;
  console.log(site)
  const response = await fetch(site)
  console.log(response.status);
});

Довольно простой небольшой фрагмент, проблема в том, что JS получает сообщение от RabbitMQ, затем запускает запрос и получает новое сообщение от RabbitMQ.

Проблема в том, что он сначала получает все сообщения и запускает все запросы, а затем пытается их разрешить - так что в итоге он просто принимает все сообщения для себя. установить максимальное количество сообщений nodejs должно быть разрешено обрабатывать в любой момент?

1 Ответ

0 голосов
/ 06 августа 2020
import * as Amqp from "amqp-ts";

const fetch = require('node-fetch');
const axios = require('axios')

let connection = new Amqp.Connection("amqp://admin:admin@localhost");
// let exchange = connection.declareExchange("ExchangeName");
let queue = connection.declareQueue("nodejs");
// queue.bind(exchange);

queue.prefetch(500);
queue.activateConsumer(async (message) => {
  const site: string = message.getContent().site;
  console.log(site)
  axios(site).then((response: any) => {
    console.log(response.status);
    message.ack();
  })
}).then(({consumerTag}) => {
  console.log(consumerTag)
});

Итак, я нашел ответ, решение, которое я нашел, заключалось в том, чтобы, во-первых, подтвердить успешное отправленное сообщение

 message.ack();

и, во-вторых, добавить максимально разрешенное количество сообщений в распакованном виде

queue.prefetch(500);

Это сработало как шарм!

...