zoukankan      html  css  js  c++  java
  • 7-EasyNetQ之Request & Response

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

    另外,不同于传统的RPC机制包括了众多的web service 工具集,EasyNetQ的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();
    }
    

    示例应用

    EasynetQ展示Request Response和Autosubcriber,连上使用Windsor IOC的示例代码地址如下:
    https://bitbucket.org/philipogorman/createrequestservice/src

    英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Request-Response

  • 相关阅读:
    setjmp()和longjmp()函数
    C语言过程活动记录
    【剑指Offer】字符串的排列
    python剑指offer系列二叉树中和为某一值的路径
    二叉搜索树的后续遍历
    如何设置学习率
    各种机器学习算法的优缺点(未完成)
    机器学习中梯度下降法和牛顿法的比较
    特征图大小的计算
    为什么L1稀疏,L2平滑?
  • 原文地址:https://www.cnblogs.com/HuangLiang/p/EasyNetQ_Request_Response.html
Copyright © 2011-2022 走看看