【EasyNetQ笔记】Request/Response、Send/Receive模式

Request/Response模式

介绍

EasyNetQ也支持Request/Response这种方式的消息模式。适合在client/Server应用中执行,客户端发送一个请求到服务器,服务器然后处理请求后返回一个响应。和传统的RPC机制不同,EasyNetQ request/response操作不需要url,仅仅需要简单的定义一对request/response消息类型。

发送同步请求

var myRequest = new MyRequest{Text ="hello Server"};
var response = bus.Request<MyRequest, MyResponse>(myRequest);
Console.WriteLine(response.Text);

发送异步请求

通常来说,使用RequestAsync方法返回一个Task是比较好的选择。

var task = bus.RequestAsync<TestRequestMessage,TestResponseMessage>(request);
task.ContinueWith(response =>{
    Console.WriteLine("Got Response:{0}",
    response.Result.Text);
    });

同步响应

bus.Respond<MyRequest,MyResponse>(request =>
    new MyResponse{ Text ="Responding to " + request.Text});

Respond带有单个参数Func<TRequest, TResponse>,接收一个请求并返回响应。假如你有持续很长时间的IO,应该使用ResponseAsync。

异步响应

EasynetQ也提供了一个RespondAsync 方法,它带有一个Func<TRequest,Task>委托参数。它允许你执行持续很长时间IO密集型的操作,而不会阻塞EasyNetQ订阅处理循环。

static void Main(string[] args)
{
    //创建一组工作线程对象。
    var workers = new BlockingCollection<MyWorkder>();
    for(int i = 0; i < 10; i++)
    {
        workers.Add(new MyWorker());
    }
    //创建一个Bus
    var bus = RabbitHutch.CreateBus("host=localhost");
    //响应请求。
    bus.RespondAsync<RequestServerTime, ResponseServerTime>( 
        request =>
            Task.Factory.StartNew(() =>
            {
                var worker = worker.Take();
                try
                {
                    return worker.Execute(request);
                }
                finally
                {
                    workers.Add(worker);
                }
            }));
    Console.ReadLine();
    bus.Dispose();
}

Send/Receive模式

发布/订阅和请求/响应模式是位置透明的,因为您不需要指定消息的使用者所在的位置,而发送/接收模式专门用于通过命名队列进行通信。它也不会假设可以通过队列发送的消息类型。这意味着您可以通过同一队列发送不同类型的消息。
发送/接收模式非常适合创建“命令管道”,您需要将缓冲通道发送到单个命令处理器。
要发送消息,请使用IBus上的Send方法,指定要将消息发送到的队列的名称以及消息本身:

bus.Send("my.queue", new MyMessage{ Text = "Hello Widgets!" });

要为特定消息类型设置消息接收器,请使用IBus上的Receive方法:

bus.Receive<MyMessage>("my.queue", message => Console.WriteLine("MyMessage: {0}", message.Text));

您可以使用带有Action 的Receive重载为同一队列上的不同消息类型设置多个接收器,例如:

bus.Receive("my.queue", x => x
    .Add<MyMessage>(message => deliveredMyMessage = message)
    .Add<MyOtherMessage>(message => deliveredMyOtherMessage = message));

如果消息到达没有匹配接收器的接收队列,EasyNetQ会将消息写入EasyNetQ错误队列,并显示“未找到消息类型<消息类型>的处理程序”。

posted @ 2020-09-05 23:17  .Neterr  阅读(744)  评论(0编辑  收藏  举报