Я работаю над своими первыми шагами с RabbitMQ и задаюсь вопросом, почему это не сработало.RabbitMQ не может отправлять и получать от того же процесса
В базовом учебнике (https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html) имеется один исполняемый файл для отправки брокеру, а другой - для его получения.
Я запустил этот код через одно консольное приложение в Visual Studio и не смог получить никаких сообщений.
Если я беру код «Получить» и помещаю его в отдельное консольное приложение и открываю его, я получаю сообщение (никаких других изменений кода).
Может кто-нибудь объяснить, почему я не могу иметь оба в одном процессе? Я понял, что фабрика соединений будет обрабатывать независимые соединения соответственно независимо от того, был ли это тот же процесс или нет.
Для полноты картины (хотя я сомневаюсь, что это необходимо), вот код, который не работал, пока я не вытащил «приемник» код и поместить его в его собственном консольного приложения:
class Program
{
static void Main(string[] args) {
Receiver.Receive();
Console.WriteLine("receiver set up");
System.Threading.Thread.Sleep(5000);
Console.WriteLine("sending...");
Test.Send();
// can also reverse order of send/receive methods, same result
Console.ReadKey();
}
}
public class Receiver
{
public static void Receive() {
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection()) {
using (var channel = connection.CreateModel()) {
channel.QueueDeclare("hello", false, false, false, null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) => {
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
System.Diagnostics.Debug.WriteLine("=====================");
System.Diagnostics.Debug.WriteLine(message);
System.Diagnostics.Debug.WriteLine("=====================");
};
channel.BasicConsume("hello", true, consumer);
}
}
}
}
public class Test
{
public static void Send() {
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection()) {
using (var channel = connection.CreateModel()) {
channel.QueueDeclare("hello", false, false, false, null);
string message = "Check it!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "hello", null, body);
}
}
}
}
Вы были правы ... У меня была моя строка Console.ReadKey за пределами используемых блоков для приемника, что фактически означает, что я не поддерживаю соединение открытым (позволяя ему распоряжаться, прежде чем у него будет возможность получить). Извиняюсь за мой предыдущий комментарий, ставя под сомнение ваше предложение. Благодаря! – jleach
@ jdl134679 Я был рад помочь вам =) Темы коварны! –