我是消息传递新手,目前正在调查使用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: '/'
看起来订阅者要么没有连接到队列(或正确的队列),要么我还需要做其他事情才能真正收到消息?
答案 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应用程序中使用。