zoukankan      html  css  js  c++  java
  • 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();
    }
    
  • 相关阅读:
    建站两个月,说说我的想法
    我见过的郭弃疾先生(兰亭集势CEO)
    C#数组和集合互相转换的几种方法的效率分析
    (五)React Ant Design Pro + .Net5 WebApi:后端环境搭建Autofac注入+ 泛型仓储
    关于C++中对私有的测试总结
    uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型(转)
    GDB调试
    linux删除乱码文件
    转:C++ nan
    vim
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13620250.html
Copyright © 2011-2022 走看看