8

我是消息传递的新手,目前正在研究使用RabbitMQ作为我们系统架构的一部分来提供不同服务之间的消息传递。我有一个基本的 RabbitMQ 示例正在工作,它可以通过总线传输基本的文本消息。看起来EasyNetQ可以简化使用 RabbitMQ 的一些复杂性,尽管我在让它工作时遇到了一些麻烦。

我想发送一条由以下类表示的更高级的消息,而不仅仅是一个字符串:

public class Message
{
    public string Text { get; set; }
    public int RandomNumber { get; set; }
    public DateTime Date { get; set; }
}

我试图通过将它发布到队列来发送它,然后让订阅者从队列中提取它。我的代码如下:

出版商

using (var bus = RabbitHutch.CreateBus("host=localhost"))
{
    var message = new Message() { Text = "Hello World", RandomNumber = new Random().Next(1,100), Date = DateTime.Now };
    bus.Publish<Message>(message);
}

接收者

using (var bus = RabbitHutch.CreateBus("host=localhost"))
{
    bus.Subscribe<Message>("test", m => Console.WriteLine(string.Format("Text: {0}, RandomNumber: {1}, Date: {2}", m.Text, m.RandomNumber, m.Date)));
}

双方似乎连接,发布者报告消息已发布:

DEBUG: Trying to connect
INFO: Connected to RabbitMQ. Broker: 'localhost', VHost: '/'
DEBUG: Published UserQuery+Message:query_lzzfst, CorrelationId ec81fc89-4d60-4a8b-8ba2-7a6d0818d2ed

订阅者记录以下内容:

DEBUG: Trying to connect
INFO: Connected to RabbitMQ. Broker: 'localhost', VHost: '/'

看起来订阅者要么没有连接到队列(或正确的队列),要么我需要做其他事情才能真正接收到消息?

4

3 回答 3

19

对不起 Mun,我是 EasyNetQ 的主要作者,我才看到这个。您的问题是您在完成订阅后就立即处理公共汽车,因此您在订阅后立即停止收听。在你的应用启动时创建总线,在它关闭时释放它。此处的文档中解释了为什么要这样做:https ://github.com/mikehadlow/EasyNetQ/wiki/Connecting-to-RabbitMQ

为了解决西蒙的观点。他是对的,EasyNetQ 有意设计为仅提供 RabbitMQ 功能的子集以简化 API。我们目前提供两种模式:pub/sub 和 request/response。期待很快看到基于主题的路由。

于 2012-04-24T08:08:30.820 回答
2

RabbitMQ 有一个管理插件 (http://www.rabbitmq.com/management.html ),这在使用 rabbit 时是必不可少的:它将向您显示交换和队列以及连接的客户端。所以你应该能够看到接收器是否连接到队列。

请注意订单,因为交易所不会保留发送给它的消息的副本;只需将其传递给绑定到它的队列(或更高版本中的其他交换),因此如果您将消息发送到交换并创建接收器 - 它创建一个临时队列并将此队列绑定到交换 - 消息可能有已经被处理 - RabbitMQ 非常快(只是大声思考)

EasyNetQ 看起来不错,但是对于某些类型的应用程序来说,不处理 ACK 消息可能是个问题。RabbitMQ 与其他人不同,它支持比 pub/sub 更多的模型,因此使用 EasyNetQ 会限制您 - 这可能是一个问题,取决于您的应用程序等。

谢谢

西蒙

于 2012-02-28T19:51:04.967 回答
-4

我也开始玩 rabbitMQ 和 easynetQ,它们都是很棒的产品。迈克·赫德洛(Mike Hedlow)关于让公共汽车成为单身人士是正确的。我创建了一个示例项目来反映这里

我的代码中的 MXRabbitBus 对象也打算在 Web 应用程序中使用。

于 2014-02-28T06:40:07.903 回答