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属性将输出到控制台。

异步请求

消息传递本质上是异步的。您发送消息,然后允许您的程序继续执行其他任务。在将来的某个时刻,您会收到回复。使用上面显示的同步Request方法,您的线程将阻塞,直到返回响应。使用返回任务的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});

Respond接受一个参数a Func<TRequest, TResponse>,它接受请求并返回响应。适用于Subscription回调的相同建议也适用于响应者。不要阻止长时间运行的IO操作。如果要执行长时间运行的IO,请改用RespondAsync。

异步响应

EasyNetQ还提供了一个需要Func<TRequest, Task<TResponse>>委托的RespondAsync方法。这允许您执行长时间运行的IO绑定操作,而不会阻止EasyNetQ订阅处理循环。

static void Main(string[] args)
{
// create a group of worker objects
var workers = new BlockingCollection<MyWorker>();
for (int i = ; i < ; i++)
{
workers.Add(new MyWorker());
}
// create the bus
var bus = RabbitHutch.CreateBus("host=localhost");
// respond to requests
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示例显示使用Windsor IOC连接的请求响应和自动订阅器

https://bitbucket.org/philipogorman/createrequestservice/src

【EasyNetQ】- 请求回复的更多相关文章

  1. spring boot aop打印http请求回复日志包含请求体

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

    构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...

  3. HTTP 请求方式: GET和POST的比较(转)

    GET和POST是HTTP的两个常用方法.   什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 ...

  4. HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

    什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...

  5. HTTP 请求方式: GET和POST的比较

    GET和POST是HTTP的两个常用方法.   什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 ...

  6. Http请求的 HttpURLConnection 和 HttpClient

    HTTP 请求方式: GET和POST的比较 请求包.png 例子.png 响应包.png 例子.png 请求头描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度, ...

  7. HTTP消息头(HTTP headers)-常用的HTTP请求头与响应头

    HTTP消息头是指,在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件.HTTP消息头用来准确描述正在获取的资源.服务器或 ...

  8. HTTP请求方式:GET和POST的比较

    GET和POST是HTTP的两个常用方法 什么是HTTP? 超文本传输协议(HyperText Transfer Prptocol-HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP ...

  9. http状态码 以及请求响应头相关

    1xx消息[编辑] 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非 ...

随机推荐

  1. Sass学习日志

    一.什么是SASS SASS是一中CSS的开发工具,提供了许多便利的写法,大大节约了设计者们的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要方法.我们的目标是,有了这篇文章,日常的 ...

  2. 2、开发环境搭建-window平台

    一.搭建ReactNative环境 首先安装node.js和python2.xx版本,不要装python3.xx,这个官方是特别说明的,请注意.NodeJs官方下载:https://nodejs.or ...

  3. mybatis笔记之一次插入多条数据sql语句写法

    <insert id="insertList" parameterType="java.util.List"> insert into balanc ...

  4. CentOS 7.4使用yum源安装php7.2

    1.如果之前已经安装我们先卸载一下 yum -y remove php* 2.由于linux的yum源不存在php7.x,所以我们要更改yum源 rpm -Uvh https://dl.fedorap ...

  5. vue组件的基本知识点

    1. 组件中 is 的特性: 有些 HTML 元素,诸如 <ul>.<ol>.<table> 和 <select>,对于哪些元素可以出现在其内部是有严格 ...

  6. 介绍三种PHP加密解密算法

    PHP加密解密算法 这里主要介绍三种常用的加密解密算法:方法一: /** * @param $string 要加密/解密的字符串 * @param string $operation 类型,ENCOD ...

  7. 2.1 进程控制之fork创建子进程

    fork()函数 目标:熟悉fork创建一个和多个子进程子线程 函数原型:pid_t fork(void); 返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 : 失败返回-1. ...

  8. DSP+ARM多核异构开发环境SYSLINK搭建OMAPL138

    DSP+ARM多核异构开发环境搭建OMAPL138 注意: 环境为Ubuntu 12.04 只能是这个环境.我甚至在Ubuntu16.04上面安装了VMware,然后,在装了一个Ubuntu 12.0 ...

  9. SIMD数据并行(三)——图形处理单元(GPU)

    在计算机体系中,数据并行有两种实现路径:MIMD(Multiple Instruction Multiple Data,多指令流多数据流)和SIMD(Single Instruction Multip ...

  10. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...