鉴于Publish/Subsrcibe和Request/Response模式是位置透明的,在这个方面,你不需要去指定消息的消费者具体所处的位置,Send/Receive模式是特别针对通过命名队列来设计的。它也使得不用假定关于什么样的消息类型能发送到这个队列。这意味着,你能够发送不同类型的消息到相同的队列中。
Send/Receive模式对于创建“命令管道”,在那种你想为单个命令处理器建立一个缓冲通道情况下,是最理想的。
去发送一个消息,使用IBus的Send方法,需要指定你想发送消息到指定队列的名称和消息本身。
bus.Send("my.queue", new MyMessage{ Text = "hello widget!"});
为特定消息类型创建一个消息接收器,使用IBus上的Receive方法:
bus.Receive("my.queue", message => Console.WriteLine("Message:{0}",message.Text));
你能够在相同队列上为不同的消息类型创建多个接收者,通过使用Receive 带有一个Action的重载方法,代码如下:
bus.Receive("my.queue", x => x .Add(message => deliveredMyMessage = message) .Add (message => deliveredMyOtherMessage = message));
如果消息送达了一个接收队列,但是没有匹配到任何接收者,EasyNetQ将会把消息带着一个异常“No handler for message type写进EasyNetQ的错误队列”。
注意:你可能不想对相同队列多次调用bus.Receive方法。这就将在队列和RatbbitMQ上创建一个新的消费者去轮询这些消息。假如你正在消费不同类型的消息,用不同的Receive调用(因此也是不同的消费者),你的有些消息将会最终发送到错误队列,因为EasyNetQ不能找到处理器去处理与你消息类型有关系的消费者,消息将会被消耗掉
英文地址:
本文地址: