EasyNetQ笔记-Request/Response模式(请求响应)

介绍

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

发送请求,处理响应

用EasyNet发送请求,调用IBus上的Request方法。

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

这里我们创建了一个新的类型为MyRequest的请求,然后调用Request方法,并用这个消息作为它的参数。当这个response响应返回时,消息的Text属性值输出到控制台。

异步请求

消息天然是异步的。你发送一个消息,然后允许你的程序继续执行其他任务。在之后的某一个时间点上,你收到响应。用异步Request方法实现上面的方法,你的线程将阻塞直到响应返回。通常来说,使用RequestAsync方法返回一个Task是比较好的选择。

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

响应请求

去写一个响应请求的服务,简单使用IBus.Respond方法。如下:

bus.Respond<MyRequest,MyResponse>(request =>
    new MyResponse{ Text ="Responding to " + request.Text});
Respond带有单个参数,一个Func<TRequest, TResponse>,接收一个请求并返回响应。同样的建议适用于订阅回调也适用于responder。不要被持续很长时间的IO操作所阻塞。假如你有持续很长时间的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();
}
原文地址:https://www.cnblogs.com/fanfan-90/p/13620250.html