因此,我想取一个Json并将其解析为Object,然后实现一个RPC RabbitMQ服务器,这样我就可以通过RabbitMQ将Object发送到服务器,在那里,Object将继续保存在本地Array中,并且将通过RPC从该服务器返回到客户端,该ID将告诉对象存储的确切位置。
官方网站显示了一些RPC在RabbitMQ中的实现,在这里你可以找到他们的实现https://www.rabbitmq.com/tutorials/tutorial-six-javascript.html,在教程中他们发送一个数字,服务器将计算斐波纳契序列,并将结果返回给客户端。相反,我想发送一个对象,而不是数字,我想接收通用的唯一id(uuid)的对象,我将存储在我的程序的一个全局数组中,我改变了代码,使它将发送一个对象,并返回uuid,但它不工作。我将感谢你们的任何帮助
//this is my server_rpc.js code :
const amqp = require('amqplib/callback_api');
const uuid = require("uuid/v1");
amqp.connect('here is the url: example: localhost', (err, conn) => {
conn.createChannel( (err, ch) => {
let q = 'rpc_queue';
ch.assertQueue(q, {durable: false});
ch.prefetch(10);
console.log(' [x] Waiting RPC requests');
ch.consume(q, function reply(msg) {
console.log("corralation key is: ", msg.properties.correlationId);
let n = uuid();
console.log(" data received ",JSON.parse(JSON.stringify(msg.content.toString())));
console.log("corralation key is: ", msg.properties.correlationId);
ch.sendToQueue(msg.properties.replyTo, Buffer.from(n.toString()), {correlationId: msg.properties.correlationId});
ch.ack(msg);
});
});
});
// and this is my client_rpc.js code :
const amqp = require('amqplib/callback_api');
const uuid = require("uuid/v1");
const express = require("express");
let data = {
"name" : "hil01",
"region" : "weissach",
"ID" : "1",
"version" : "0.0.1"
}
amqp.connect('url: example localhost ', (err, conn) => {
conn.createChannel( (err, ch) => {
ch.assertQueue('', {exclusive: true}, (err, q) => {
var corr = generateUuid();
var newHil = JSON.stringify(data);
console.log(" [x] Requesting uuid for the registered HIL: ", newHil );
console.log("corralation key is: ", corr);
ch.consume(q.queue, function(msg) {
if(msg.properties.correlationId == corr) {
console.log(" [.] Got %s", msg.content.toString());
setTimeout(() => { conn.close(); process.exit(0) }, 100);
}
}, {noAck: true});
ch.sendToQueue('rpc_queue', Buffer.from(newHil, {correlationId: corr, replyTo: q.queue }));
});
});
});
//method to generate the uuid, later will be replaced with the real
uuid function
var generateUuid = () => Math.random().toString() +
Math.random().toString() + Math.random().toString() ;
当我运行server_rpc时,[x]等待的请求应该被打印出来,然后在一个单独的cmd中,我运行client_rpc. js,然后对象应该被发送,服务器执行并将uuid返回给我,返回给客户端。
2条答案
按热度按时间w3nuxt5m1#
看起来这里需要的是直接回复RPC模式:您希望发送消息并获得响应。
以下是RabbitMQ上有关直接回复的文档:https://www.rabbitmq.com/direct-reply-to.html
左侧;右侧
下面是一个客户端和服务器的示例,它们将在机箱中工作:
https://github.com/Igor-lkm/node-rabbitmq-rpc-direct-reply-to
"里面是什么"
安装RabbitMQ后,您将需要执行2个文件:
server.js
client.js
您将得到如下结果:
2g32fytz2#
实际上,这不是问题答案,只是供您参考的文本
更改
现在2022
amqplib
API有一些小的变化,如下所示:channel.responseEmitter.emit
至channel.emit
channel.responseEmitter.once
至channel.once
channel.responseEmitter.setMaxListeners
至channel.setMaxListeners
更多详细信息,请参见official api document
备选方案
并且如果您正在寻找单圈rpc(类似于请求和响应,直接grep响应数据)。
我建议使用
channel.get
,详情请参阅此处