使用EasyNetQ和RabbitMQ发布和接收消息

时间:2012-02-28 16:44:16

标签: rabbitmq message-queue easynetq

我是消息传递新手,目前正在调查使用RabbitMQ作为我们系统架构的一部分,以便在不同服务之间提供消息传递。我有basic RabbitMQ example工作,它可以通过总线传输基本文本消息。看起来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: '/'

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

3 个答案:

答案 0 :(得分:17)

对不起,我是EasyNetQ的主要作者,我才刚看到这个。您的问题是您在完成订阅后立即处理了公交车,因此您在订阅后立即停止收听。在应用启动时创建总线,在关闭时将其丢弃。为什么要这样做,请参阅此处的文档:https://github.com/mikehadlow/EasyNetQ/wiki/Connecting-to-RabbitMQ

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

答案 1 :(得分:2)

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

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

EasyNetQ是一项工作,但不处理ACK消息可能是某种类型的应用程序的问题。与其他人不同,RabbitMQ支持的模型比pub / sub更多,因此使用EasyNetQ会限制你 - 这可能是一个问题,取决于你的应用程序等。

由于

西蒙

答案 2 :(得分:-3)

我也开始玩RabbitMQ和easynetQ,它们都是很棒的产品。 Mike Hedlow对于使公交车成为单身人士是正确的。我已经创建了一个示例项目来反映这个here

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