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),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
随机推荐
- 爬虫第三篇:requests模块
requests模块其实就是对urllib.request模块的进步一不优化,提供了很多可选的参数,同时简化了操作.下面我还是贴上具体操作的代码. requests GET请求 GET请求html文件 ...
- bootstrap参考网站
http://www.chuntao.org.cn/http://www.dianxiaohuo.com/
- CSS之动态相册
注释还是比较详细的,所以我就不一一再说明了.--->运行效果图<--- (点击之前温馨提示一下:此picture是我自己的照片,本来不想拿出来的,后来觉得反正不会有很多人看到而且也没人认识 ...
- dom 兼容性问题1_节点部分
AS : ECMAScript xml . html js组成: 1,ECMAScript : 是Javascript的核心标准.同时也是一个解释器. 2,DOM: document object m ...
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
- Mysql ERROR 145 (HY000)
问题:今天Mysql数据库异常关闭,起来之后感觉可以了. 但是运行业务数据的时间就类似如下的错误 ERROR 145 (HY000) at line 34: Table './database_nam ...
- Beautifusoup
text = soup.find('div', {'class': 'mulu'}) #查找目录,坑死我了.就这个东西,知乎上看别人写的爬取网络小说,这个最适合我.我一开始老是使用beautifuls ...
- jquery判断密码是否一致?
密码 请输入密码 重新输入密码 请输入新密码 <input type="text" id="btn0"> 密码 <span class=&qu ...
- JVM_总结_02_Java技术体系
一.前言 此系列随笔是针对<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>的总结 上一节,我们搭建好了java的开发环境,这一节,我们来看Java的技术体系 二.Java技术体 ...
- 不带缓存IO和标准(带缓存)IO
linux对IO文件的操作分为: 不带缓存:open read.posix标准,在用户空间没有缓冲,在内核空间还是进行了缓存的.数据-----内核缓存区----磁盘 假设内核缓存区长度为100字节,你 ...