EasyNetQ也支持Request/Response这种方式的消息模式。这种方式很容易在client/Server应用中执行,客户端发送一个请求到服务器,服务器然后处理请求后返回一个响应。和传统的RPC机制不同,EasyNetQ request/response操作不需要有一个名字,仅仅需要简单的定义一对request/response消息类型。

另外,不同于传统的RPC机制包括了众多的web service 工具集,EasyNetQrequest/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);
});
  • 1
  • 2
  • 3
  • 4
  • 5

响应请求

去写一个响应请求的服务,简单使用IBus.Respond方法。如下:

bus.Respond<MyRequest,MyResponse>(request =>
new MyResponse{ Text ="Responding to " + request.Text});

Respond带有单个参数,一个Func,接收一个请求并返回响应。同样的建议适用于订阅回调也适用于responder。不要被持续很长时间的IO操作所阻塞。假如你有持续很长时间的IO,应该使用ResponseAsync

异步响应

EasynetQ也提供了一个RespondAsync 方法,它带有一个Func>委托参数。它允许你执行持续很长时间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 ResponseAutosubcriber,连上使用Windsor IOC的示例代码地址如下:
https://bitbucket.org/philipogorman/createrequestservice/src


鉴于Publish/SubsrcibeRequest/Response模式是位置透明的,在这个方面,你不需要去指定消息的消费者具体所处的位置,Send/Receive模式是特别针对通过命名队列来设计的。它也使得不用假定关于什么样的消息类型能发送到这个队列。这意味着,你能够发送不同类型的消息到相同的队列中。

Send/Receive模式对于创建“命令管道”,在那种你想为单个命令处理器建立一个缓冲通道情况下,是最理想的。

去发送一个消息,使用IBusSend方法,需要指定你想发送消息到指定队列的名称和消息本身。

bus.Send("my.queue", new MyMessage{ Text = "hello widget!"});
  • 1

为特定消息类型创建一个消息接收器,使用IBus上的Receive方法:

bus.Receive<MyMessage>("my.queue",
message => Console.WriteLine("Message:{0}",message.Text));

你能够在相同队列上为不同的消息类型创建多个接收者,通过使用Receive 带有一个Action的重载方法,代码如下:

bus.Receive("my.queue", x => x
.Add<MyMessage>(message => deliveredMyMessage = message)
.Add<MyOtherMessage>(message => deliveredMyOtherMessage = message));

如果消息送达了一个接收队列,但是没有匹配到任何接收者,EasyNetQ将会把消息带着一个异常“No handler for message type写进EasyNetQ的错误队列”。

注意:你可能不想对相同队列多次调用bus.Receive方法。这就将在队列和RatbbitMQ上创建一个新的消费者去轮询这些消息。假如你正在消费不同类型的消息,用不同的Receive调用(因此也是不同的消费者),你的有些消息将会最终发送到错误队列,因为EasyNetQ不能找到处理器去处理与你消息类型有关系的消费者,消息将会被消耗掉

EasyNetQ使用(四)【Request与Response,Send与Receive】的更多相关文章

  1. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  2. JavaWeb学习笔记四 request&response

    HttpServletResponse 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应res ...

  3. Servlet(四):request和response对象

    Request对象:问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器. 那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性. 解决: 使用对象进行存储,服务器每 ...

  4. JavaWeb Request和Response

    1. Request与Response 1.1. Web应用运行机制 到目前为止,我们已经掌握了Web应用程序的运行机制,现在学习的就是Web应用程序运行机制中很重要的内容 —— Request与Re ...

  5. 【转】request和response的页面跳转传参

    下面是一位园友的文章: jsp或Servlet都会用到页面跳转,可以用 request.getRequestDispatcher("p3.jsp").forward(request ...

  6. JavaWeb(一)Servlet中的request与response

    一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP ...

  7. 第十五节:HttpContext五大核心对象的使用(Request、Response、Application、Server、Session)

    一. 基本认识 1. 简介:HttpContext用于保持单个用户.单个请求的数据,并且数据只在该请求期间保持: 也可以用于保持需要在不同的HttpModules和HttpHandlers之间传递的值 ...

  8. java web(三):ServletContext、session、ServletConfig、request、response对象

    上一篇讲了Servlet: 1)什么是Servlet[servlet本身就是一种Java类,这种Java类提供了web形式的方法,只要实现了servlet接口的类,都是一种servlet资源.] 2) ...

  9. servlet中的request和response

    request对象 1.什么是请求 a.浏览器向服务器发送数据就是请求. 一.request功能1--获取数据 1.获取浏览器相关的信息 getRequestURL方法 -- 返回客户端发出请求完整U ...

随机推荐

  1. win服务器 解决apache 80端口被占用问题

    是系统的服务占用了80端口,所以要么结束系统服务,要么修改apache端口. PID4的服务是World Wide Web Publishing Service 这里选择结束这个系统服务,运行serv ...

  2. jquery动态背景切换全屏登录插件supersized.js

    下载地址:https://download.csdn.net/download/t101lian/10434198预览: http://www.daimabiji.com/codedemo/1530 ...

  3. HTTP通过Get请求传递参数时特殊字符被转码的处理方式

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了. 编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 ...

  4. 第95题:不同的二叉搜素树II

    一. 问题描述 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,n ...

  5. phpstorm和ftp搭配使用

    简单使用

  6. nginx+uwsgi+bottle python服务器部署

    一.安装nginx(如果服务器上已经有nginx了,则无需重复安装) sudo apt-get install nginx 二.nginx配置,例如:/etc/nginx/conf.d/digger. ...

  7. GitHub 基础搜索技巧

    一.GitHub基本信息栏 1.项目名称 2.项目简介 3.项目的README.md文档 ​ 项目的详细介绍 4.项目的最后更新时间 ​ 是否还有人维护等等... 二.搜索方式列举 1. 在name\ ...

  8. VSCode:使用GIT

    准备:安装GIT.安装VSCode.GitHub上添加 1.初始化 新建本地文件xmai # 全局配置加上命令--global ,如果只想在本文件夹则去掉此参数即可: > git init &g ...

  9. P3648 [APIO2014]序列分割 斜率优化

    题解:斜率优化\(DP\) 提交:\(2\)次(特意没开\(long\ long\),然后就死了) 题解: 好的先把自己的式子推了出来: 朴素: 定义\(f[i][j]\)表示前\(i\)个数进行\( ...

  10. Django-中间件实现1分钟内只允许三次访问

    代码 class Throttle(MiddlewareMixin): def process_request(self, request): # 1. 拿到用户请求的IP # print(reque ...