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属性被输出到控制台。
异步请求
消息传递本质上是异步的。 您发送消息,然后允许您的程序继续其他任务。 在将来的某一时刻,您会收到回应。 使用上面显示的同步请求方法,您的线程将阻塞,直到返回响应。 使用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});
响应采用一个参数,一个需要请求并返回响应的Func <TRequest,TResponse>。 适用于订阅回调的相同建议也适用于响应者。 不要阻止长时间运行的IO操作。 如果要执行长时间运行的IO,请改用RespondAsync。
异步响应
EasyNetQ还提供了一个RespondAsync方法,它使用Func <TRequest,Task <TResponse >>委托。 这允许您执行长时间运行的IO绑定操作,而不会阻止EasyNetQ订阅处理循环。
static void Main(string[] args) { //创建一组工作对象 var workers = new BlockingCollection<MyWorker>(); 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 = workers.Take(); try { return worker.Execute(request); } finally { workers.Add(worker); } })); Console.ReadLine(); bus.Dispose(); }
示例应用程序
EasyNetQ示例显示请求响应和Autosubcriber,使用Windsor IOC进行连接
https://bitbucket.org/philipogorman/createrequestservice/src