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

4,EasyNetQ-Request Response的更多相关文章

  1. 7-EasyNetQ之Request & Response

    EasyNetQ也支持Request/Response这种方式的消息模式.这种方式很容易在client/Server应用中执行,客户端发送一个请求到服务器,服务器然后处理请求后返回一个响应.和传统的R ...

  2. JavaWeb——JSP内置对象request,response,重定向与转发 学习总结

    什么是JSP内置对象 九大内置对象 requestJSP内置对象 request对象常用方法 request练习 responseJSP内置对象 response练习 response与request ...

  3. Ng Http Request/response格式转换

    angular作为Single Page Application推荐的交互方式当然是基于json的ajax调用.但今天要说的是当你不幸工作在一个遗留或者不可控制的服务上,而这服务是基于非json提交方 ...

  4. 过滤器中的chain.doFilter(request,response)

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...

  5. 对chain.doFilter(request,response)的理解

    他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就 ...

  6. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

  7. ZeroMQ之Request/Response (Java)

    自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...

  8. 【转】对Django框架架构和Request/Response处理流程的分析

    本文转载于疯狂的蚂蚁. 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求.返回都由中间件来完成. ...

  9. javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别

    先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转 ...

  10. JSP最常用的五种内置对象(out,request,response,session,application)

    为了简化开发过程,JSP提供了一些内置对象,它们由容器实现和管理.开发者在JSP页面中无需声明,无需实例化就可使用.主要有out,request,response,session,applicatio ...

随机推荐

  1. 鸟哥的Linux私房菜——第八章

    参考鸟哥的Linux私房菜内容,我只是简单的记录比较重要的知识点,所以排版没怎么注意,如果写的太严肃小白也看不进去吧. 看视频!这篇文章只作为备忘录 视频链接:http://www.tudou.com ...

  2. Spark记录-Scala异常与处理

    Scala try-catch语句 Scala提供try和catch块来处理异常.try块用于包含可疑代码.catch块用于处理try块中发生的异常.可以根据需要在程序中有任意数量的try...cat ...

  3. web html 基础2

    1.表格<table> 行 tr,没有列的说法,只是单元格td table里面只能仿tr,tr里面只能放td,td可以嵌套任何标签 表格属性 border 边框, cellspacing ...

  4. 总有一些实用javascript的元素被人遗忘在角落-slice

    slice() 方法可从已有的数组中返回选定的元素. 好吧,我承认我竟然把它忘了! 这次我在回顾一下它 语法 arrayObject.slice(start,end) 数组.slice(起始,结束) ...

  5. html5 canvas结构基础

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题

    这个方法其实已经使用很久了,之前主要在嵌入式WebQQ等产品中用过,现在拿出来分享一下吧,是目前最简洁的方式来实现ie6的position:fixed; 失效bug,以及的其他方法的闪动问题,CSS代 ...

  7. 从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值   比如 public Users Get(int id) ,它可以使用两种方式获取:   api/default/5 $.get("/api/default" ...

  8. python垃圾回收三之标记清除

    #第一组循环引用# a = [1,2] b = [3,4] a.append(b) b.append(a) del a ## #第二组循环引用# c = [4,5] d = [5,6] c.appen ...

  9. [Alg] 尺取法

    尺取法是在线性结构中进行搜寻满足某一条件的区间的方法. 该方法保存两个索引--首索引begin.尾索引end.判断 [begin, end] 区间是否满足条件. 移动 [begin, end] 区间的 ...

  10. DVWA的Xss跨站总结

    Xss跨站总结 初级防护的代码 Poc:<script>alert(1)</script> 上图防护的代码 为输入的结果就为输出的结果 中级防护的代码 Poc:<scri ...