Ich fange an, RabbitMQ zu verwenden, und nachdem ich die Tutorials verfolgt habe, versuche ich nun, es so zu machen, wie ich es brauche und ich stehe in Schwierigkeiten. Die Einrichtung, die ich habe, ist, dass ich in der Lage sein muss, einen RPC zuerst zu machen, und dann basierend auf der Antwort von dem Client eine weitere Nachricht an eine Arbeitswarteschlange senden wird (oder nicht) wird, auf die ich keine Antwort brauche der Kunde). Leider scheinen meine Bemühungen, diese Zusammenarbeit in Gang zu bringen, nicht so zu funktionieren, wie ich es möchte. Auf der Serverseite, habe ich so etwas wie diese (ich viele Variationen alle mit den gleichen Problemen versucht habe):Arbeitswarteschlange und RPC zusammen arbeiten
var factory = new ConnectionFactory() { HostName = "localhost" };
connection = factory.CreateConnection();
channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "jobs", type: "direct", durable: true);
// I started with a named queue, not sure if that's better or worse for this
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
exchange: "jobs",
routingKey: "saveJob_queue");
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
// save stuff that was sent with the saveJob_queue routingKey
}
channel.BasicConsume(queue: queueName,
noAck: false,
consumer: consumer);
// set up channel for RPC
// Not sure if this has to have another channel, but it wasn't working on the same channel either
rpcChannel = connection.CreateModel();
var rpcQueueName = rpcChannel.QueueDeclare().QueueName;
rpcChannel.QueueBind(queue: rpcQueueName,
exchange: "jobs",
routingKey: "rpc_CheckJob_queue");
var rpcConsumer = new EventingBasicConsumer(rpcChannel);
rpcConsumer.Received += (model, ea) =>
{
// do my remote call and send back a response
}
Das Problem, das ich habe ist, dass eine Nachricht an den noch jobs
Austausch mit dem Routing-Schlüssel rpc_CheckJob_queue
gesendet beendet das Auslösen des Recieved
Ereignisses auf dem ersten Kanal trotz der Tatsache, dass es nur saveJob_queue
Routen erhalten sollte. Ich könnte ea.RoutingKey
in diesem Handler überprüfen und diese Nachrichten einfach ignorieren, aber ich verstehe nicht, wie und warum sie dort überhaupt landen?
Was wäre der richtige Weg, um eine Verbindung einzurichten, so dass sowohl Arbeitswarteschlangenmeldungen als auch RPC-Nachrichten empfangen und korrekt verarbeitet werden können?
Vermissen Sie etwas wie 'rpcChannel .BasicConsume (rpcQueueName: queuename,' Auch wenn Sie Ihren Code für das Senden der Nachrichten veröffentlichen konnte – cantSleepNow