2
我正在通过我的第一步与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我很乐意帮助你=)线程是阴险的! –