首页 > 解决方案 > 我如何从 RabbitMQ 消息发出 http 请求 - nodejs

问题描述

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在任何时候处理的最大消息数的好方法(或只是一种可行的方法)?

标签: node.jsrabbitmq

解决方案


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);

这就像一个魅力!


推荐阅读