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
7-EasyNetQ之Request & Response的更多相关文章
- request response
request 和 response 这两个对象是出现在service方法中.service方法是用来接收请求处理请求,完成响应的. 接受请求指的就是request对象 完成响应指的就 ...
- request \response 总结
request&response request 1.获得信息的方法 1> 获得请求首行信息的方法 *getMethod *getContextP ...
- track message forwards, avoiding request loops, and identifying the protocol capabilities of all senders along the request/response chain
https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html The TRACE method is used to invoke a remote, ...
- Ng Http Request/response格式转换
angular作为Single Page Application推荐的交互方式当然是基于json的ajax调用.但今天要说的是当你不幸工作在一个遗留或者不可控制的服务上,而这服务是基于非json提交方 ...
- 过滤器中的chain.doFilter(request,response)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...
- 对chain.doFilter(request,response)的理解
他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就 ...
- chain.doFilter(request,response)含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...
- controlling the variance of request response times and not just worrying about maximizing queries per second
http://highscalability.com/blog/2010/11/4/facebook-at-13-million-queries-per-second-recommends-minim ...
- ZeroMQ之Request/Response (Java)
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
随机推荐
- Bellman-Ford算法 O(NE)
Bellman-Ford算法 O(NE) 思路:枚举n-1次所有边,通过枚举所有边,将所有和已知点相连的点都设为已知,初始时起点为已知点. ;i<=n-;i++){ //n-1是次数,枚举n-1 ...
- Android在layout xml中使用include完成静态加载
Android在layout xml中使用include完成静态加载 include静态加载:不仅可以加载布局,还可以加载控件(控件标签名要在最外层)include标签中有个layout属性就是专门用 ...
- Sublime Text 3 (含:配置 C# 编译环境)
Sublime Text 3http://www.sublimetext.com/3http://www.sublimetext.com/3dev 1. 关闭自动更新 菜单:Preferences ...
- Ceph pg分裂流程及可行性分析
转自:https://www.ustack.com/blog/ceph-pg-fenlie/ 1 pg分裂 Ceph作为一个scalable的分布式系统,集群规模会逐渐增大,为了保证数据分布的均匀性, ...
- Python - Package os
for (path,dirs,files) in os.walk(path): for filename in files: #do something here os. walk(top, topd ...
- android根据原图片的路径得到该图片的缩略图
/** * 根据图片的路径得到该图片在表中的ID * @param cr * @param fileName * @return */ public static String getImageIdF ...
- 打印a*a的乘法表
/*利用for循环打印 9*9 表? 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 ...
- xsl教程学习笔记
一 . Hello world 尝试: Hello.xml: <?xml version="1.0" encoding="UTF-8"?> < ...
- 在winform中给GridView加checkbox在按钮点击的时候获取选中的checkbox
dataGridView绑定后 bool[] mark = new bool[this.dataGridView1.Rows.Count]; ; i < mark.Length; i++) { ...
- L124
I have a toothache because there is a cavity in one of my teeth. I founded an orphanage last year an ...