node.js - 我如何从 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在任何时候处理的最大消息数的好方法(或只是一种可行的方法)?
解决方案
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);
这就像一个魅力!
推荐阅读
- openlayers - 从geojson绘制openlayers折线
- json - 使用 jsonschema 和 robotsframework 验证 json
- c# - 无法使用 Microsoft.Azure.ServiceBus 连接到 Azure ServiceBus
- python - 设置详细的正则表达式
- c# - 如何创建不是数据库中实体的 FileUpload 视图/视图模型
- sql-server - SQL Server 中的 Max 和 Decode 转换
- angularjs - AngularJS - 子组件不更新父组件数据
- javascript - 提供 loadChildren 函数有什么好处?
- c++ - LLVM 遍历 IR 并查找对 @llvm.dbg.declare 的所有调用
- powershell - 在基于 windows server 1709 的容器内运行带有 args 的可执行文件