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 = ; i < ; 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

最新文章

  1. AndroidTips-052:.aar文件依赖
  2. 现代软件工程作业 github使用
  3. Java动态编程初探——Javassist
  4. Exception in thread &quot;main&quot; java.lang.ExceptionInInitializerError
  5. 不使用arc功能时的编译参数 –fno-objc-arc
  6. [SAP ABAP开发技术总结]程序自己以JOB方式运行
  7. tortoisegit安装使用
  8. 随记一个C的毫秒级群PING
  9. substring和substr、$.extend()、$.fn.extend()、(function($){….})(jQuery)的简易讲解
  10. 每天一个linux命令(29)--Linux chmod命令
  11. Python学习之路-Day1-Python基础
  12. c++ primer plus 第二章 \n与endl在输出上的区别
  13. Multi-Projector Based Display Code ------- Home
  14. 布局管理器之BorderLayout(边界布局)
  15. 2017-9-8-RaspberryPi安装过程
  16. navLI鼠标滑上显示下拉导航
  17. Java给整数部分的字符串加上千分位分隔符
  18. BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分
  19. 从头到尾谈一下HTTPS
  20. (机器学习)小试牛刀 利用Zapier和MonkeyLearn

热门文章

  1. 形参与实参的区别---java基础
  2. 手机安全卫士-——Splash总结
  3. spectrogram函数做短时傅里叶分析
  4. 基于docker的spark-hadoop分布式集群之二: 环境测试
  5. [转载]ASP.NET Error – Adding the specified count to the semaphore would cause it to exceed its maximum count
  6. shiro登录成功之后跳转原路径
  7. C# 文件Copy
  8. Android View坐标系详解(getTop()、getX、getTranslationX...)
  9. nested exception is com.svorx.core.dao.PersistenceException
  10. Shell中各种判断语法