我正在使用示例代码使用“扇出”交换类型实现发布/订阅。但如下面的代码订阅者不显示已发布的“Hello Word”消息。
Publisher.cs
data <- read.table("mydata.txt")
plot(data[,1])
Subscriber.cs
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "logs",
routingKey: "",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
private static string GetMessage(string[] args)
{
return ((args.Length > 0)
? string.Join(" ", args)
: "info: Hello World!");
}
代码参考: https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html
答案 0 :(得分:1)
当你发现它确实有效时,你只需要先启动用户。为什么?答案也在您提供的链接上。我在这里引用一部分:
但我们的记录器并非如此。我们想听听所有日志 消息,而不仅仅是它们的一个子集。我们也只对它感兴趣 当前流动的消息不在旧消息中。解决我们需要的问题 两件事。
首先,每当我们连接到Rabbit 时,我们都需要一个新的空队列。 为此,我们可以创建一个随机名称的队列,或者甚至更好 - 让服务器为我们选择随机队列名称。
其次,一旦我们断开消费者,队列应该是 自动删除。
这基本上意味着只有在启动订阅者时才会创建队列,并且只有在那时,交换机才有一个实际放入消息的队列。由于您首先启动发布者,因此消息没有队列最终进入。