zoukankan      html  css  js  c++  java
  • 【EasyNetQ】- 请求回复

    EasyNetQ还支持请求/响应消息传递模式。这使得实现客户端/服务器应用程序变得容易,客户端向服务器发出请求,然后服务器处理请求并返回响应。与传统的RPC机制不同,EasyNetQ请求/响应操作没有名称,但只是由请求/响应消息类型对定义。

    此外,与传统的RPC机制(包括大多数Web服务工具包)不同,EasyNetQ的请求/响应模式基于消息传递,因此它是开箱即用的异步。

    提出请求并处理响应

    要使用EasyNetQ发出请求,请在IBus上调用Request方法:

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

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

    异步请求

    消息传递本质上是异步的。您发送消息,然后允许您的程序继续执行其他任务。在将来的某个时刻,您会收到回复。使用上面显示的同步Request方法,您的线程将阻塞,直到返回响应。使用返回任务的RequestAsync方法通常是更好的选择:

    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接受一个参数a Func<TRequest, TResponse>,它接受请求并返回响应。适用于Subscription回调的相同建议也适用于响应者。不要阻止长时间运行的IO操作。如果要执行长时间运行的IO,请改用RespondAsync。

    异步响应

    EasyNetQ还提供了一个需要Func<TRequest, Task<TResponse>>委托的RespondAsync方法这允许您执行长时间运行的IO绑定操作,而不会阻止EasyNetQ订阅处理循环。

    static void Main(string[] args)
        {
            // create a group of worker objects
            var workers = new BlockingCollection<MyWorker>();
            for (int i = 0; i < 10; i++)
            {
                workers.Add(new MyWorker());
            }
            // create the bus
            var bus = RabbitHutch.CreateBus("host=localhost");
            // respond to requests
            bus.RespondAsync<RequestServerTime, ResponseServerTime>(request =>
                Task.Factory.StartNew(() =>
                {
                    var worker = workers.Take();
                    try
                    {
                        return worker.Execute(request);
                    }
                    finally
                    {
                        workers.Add(worker);
                    }
                }));
            Console.ReadLine();
            bus.Dispose();
        }

    示例应用

    EasyNetQ示例显示使用Windsor IOC连接的请求响应和自动订阅器

    https://bitbucket.org/philipogorman/createrequestservice/src

  • 相关阅读:
    HDU_5688
    微服务的一致性问题
    我来博客园啦
    异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
    异常:Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException
    异常:Unknown lifecycle phase "mvn". You must specify a valid lifecycle
    SpringMVC中遇到页面跳转出现404错误的问题
    Could not resolve view with name '***' in servlet with name 'dispatcher'
    关于Could not resolve dependencies for project
    让我们相互交流
  • 原文地址:https://www.cnblogs.com/wangwust/p/9437371.html
Copyright © 2011-2022 走看看