MassTransit中RequestResponse基本使用

MassTransit 是一个自由、开源、轻量级的消息总线基于.Net框架, 用于创建分布式应用程序。方便搭建基于消息的松耦合异步通信的应用程序和服务。MassTransit 在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于消息的会话模式异步连接服务。基于消息的通信是实现面向服务的体系结构的可靠和可扩展的方式。

官网地址:http://masstransit-project.com/

发布订阅模式

这种场景十分常见,发送一个消息(或事件)到消息队列中,有一个或是多个订阅方对预期的消息接收处理。

基于需要搭建了两个WebApi程序,用于模拟发送方和订阅方,其中的RabbitMQ已预先搭建好了,只在程序中引用包配置下即可。

<PackageReference Include="MassTransit" Version="7.2.0" />
<PackageReference Include="MassTransit.AspNetCore" Version="7.2.0" />
<PackageReference Include="MassTransit.RabbitMQ" Version="7.2.0" />

发布端配置

在Startup中增加MassTransit需要的服务及初始化配置。

  • 对RabbitMQ的连接地址端口、虚拟主机、访问账号密码等系列配置。

  • 对发送方需要发送的消息初始化一个请求客户端,配置请求信息及推送到MQ的地址。

services.AddMassTransit(x =>
{x.UsingRabbitMq((context, cfg) =>{cfg.Host(Configuration["RabbitmqConfig:HostIP"], ushort.Parse(Configuration["RabbitmqConfig:HostPort"]), Configuration["RabbitmqConfig:VirtualHost"], h =>{h.Username(Configuration["RabbitmqConfig:Username"]);h.Password(Configuration["RabbitmqConfig:Password"]);});});x.AddRequestClient<ValueEntered>(new Uri(GetServiceAddress("events-valueentered")));
});
services.AddMassTransitHostedService();

为了快速了解,使用Controller在Action中发起对MQ的消息推送

[ApiController]
[Route("[controller]")]
public class ValueController : ControllerBase
{readonly IPublishEndpoint _publishEndpoint;public ValueController(IPublishEndpoint publishEndpoint){_publishEndpoint = publishEndpoint;}[HttpPost]public async Task<ActionResult> Post(string value){await _publishEndpoint.Publish<ValueEntered>(new{Value = value});return Ok();}
}

订阅端配置

订阅端也创建一个WebApi应用,在Startup中增加MassTransit的服务,使用到的Nuget包和发布端一样。

  • 对RabbitMQ的连接地址端口、虚拟主机、访问账号密码等系列配置。

  • 为订阅端增加一个订阅处理的Handler,即如下的ValueEnteredEventConsumer

  • 增加一个接受点,指定队列名称,即发送端发送的队列名称,设置该队列消费处理的Consumer,即ValueEnteredEventConsumer

services.AddMassTransit(x =>
{x.AddConsumer<ValueEnteredEventConsumer>();x.UsingRabbitMq((context, cfg) =>{cfg.Host(Configuration["RabbitmqConfig:HostIP"], ushort.Parse(Configuration["RabbitmqConfig:HostPort"]), Configuration["RabbitmqConfig:VirtualHost"], h =>{h.Username(Configuration["RabbitmqConfig:Username"]);h.Password(Configuration["RabbitmqConfig:Password"]);});cfg.ReceiveEndpoint("events-valueentered", e =>{e.ConfigureConsumer<ValueEnteredEventConsumer>(context);});});
});
services.AddMassTransitHostedService();

如此一来,通过Postman发送一个请求,经发布端发布一个消息到RabbitMQ,订阅端侦听消息,处理消息,一切都很熟悉。

请求响应模式

在发布订阅的基础上,改变以往的习惯,当发布一个消息后,等待订阅方的处理,并将消息推送回RabbitMQ,发送方接受到处理后的消息继续执行。

请求端

在Startup中新加上一个用于发送消息(CheckOrderStatus)的请求客户端及指定消息队列名称(为每一个消息创建一个单独的队列)。

x.AddRequestClient<CheckOrderStatus>(new Uri(GetServiceAddress("events-checkorderstatus")));

增加一个Controller及Action,来请求及获取处理结果(OrderStatusResult)。

[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{private readonly IRequestClient<CheckOrderStatus> _client;public OrderController(IRequestClient<CheckOrderStatus> client){_client = client;}public async Task<OrderStatusResult> Get(string id){var response = await _client.GetResponse<OrderStatusResult>(new { OrderId = id });return response.Message;}
}

响应端

同样在响应端Startup中对新的消息设置下消息侦听队列以及相应的Handler如下的ValueEnteredEventConsumer去消费消息并返回处理结果。

x.AddConsumer<CheckOrderStatusConsumer >();
x.UsingRabbitMq((context, cfg) =>
{// ...cfg.ReceiveEndpoint("events-checkorderstatus", e =>{e.ConfigureConsumer<CheckOrderStatusConsumer >(context);});
});

Consumer中获取请求参数,执行请求,返回执行结果。

public class CheckOrderStatusConsumer : IConsumer<CheckOrderStatus>
{public async Task Consume(ConsumeContext<CheckOrderStatus> context){if (context.Message.OrderId == "9527"){throw new InvalidOperationException("Order not found");}Console.WriteLine($"OrderId:{context.Message.OrderId}");await context.RespondAsync<OrderStatusResult>(new{OrderId = context.Message.OrderId,Timestamp = Guid.NewGuid().ToString(),StatusCode = "1",StatusText = "Close"});}
}

这样一来,当请求端发起一个消息(事件)到RabbitMQ,响应端侦听并处理完毕返回处理结果到RabbitMQ,请求端依照响应结果继续执行后续请求。

HTTP方式差异

与以往的Http请求方式有所不同,通过httpClient.PostAsync发送请求,接收端处理并返回结果,而走requestClient发送请求到RabbitMQ,再由RabbitMQ推送到侦听节点消费并返回结果,如下第一二部分结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

今天项目展示&#xff0c;但是有些数据不是特别规范&#xff0c;我就直接使用Toad去操作数据库中的数据。结果在修改某一张表的时候就出现了上述错误&#xff0c;表示十分无奈。 出错原因分析&#xff1a; 首先执行如下语句&#xff1a; SELECT sid, serial#, username, osuser…

php2612,达人曝光LGLSNJ2612AR质量好吗?怎么样呢?体验报告揭秘

其实这个LGLSNJ2612AR还可以的 哟&#xff0c;超凡的造型设计和外观&#xff0c;做工细腻&#xff0c;不少的人想要了解这LGLSNJ2612AR怎么样&#xff1f;质量好不好&#xff1f;实实在在的说这款LGLSNJ2612AR使用体验后个人感觉蛮可以的哈&#xff0c;刚购没多久的&#xff0c…

数据仓库的 RDBMS 性能优化指南

转&#xff1a;http://www.microsoft.com/china/technet/prodtechnol/sql/2000/maintain/c2061.asp数据仓库的 RDBMS 性能优化指南 本性能优化指南旨在帮助数据库管理员和开发人员配置 Microsoft SQL Server™ 2000&#xff0c;以获得最佳的性能&#xff0c;并帮助找出造成关系…

JAVA反射使用手记

JAVA反射使用手记 本篇文章为在工作中使用JAVA反射的经验总结&#xff0c;也可以说是一些小技巧&#xff0c;以后学会新的小技巧&#xff0c;会不断更新。本文不准备讨论JAVA反射的机制&#xff0c;网上有很多&#xff0c;大家随便google一下就可以了。 在开始之前&#xff0c;…

说普通话时舌头卷不起来是一种什么体验?| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅

使用Lucene.Net实现全文检索

Lucene.net是Lucene的.net移植版本&#xff0c;是一个开源的全文检索引擎开发包&#xff0c;即它不是一个完整的全文检索引擎&#xff0c;而是一个全文检索引擎的架构&#xff0c;提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。Lucene.net是…

独立主题需要有index.php模板文件,wordpress 主题模板文件列表及其作用

wordpress 主题模板文件列表及其作用主页:1.home.php2.index.php文章页&#xff1a;1.single-{post_type}.php – 如果文章类型是videos(即视频)&#xff0c;WordPress就会去查找single-videos.php(WordPress 3.0及以上版本支持)2.single.php3.index.php页面:1.自定义模板 – 在…

vim编辑技巧

转载于:https://blog.51cto.com/ovcer/1353415

IT基础设施最佳实践ITIL

IT基础设施最佳实践ITIL1. 前言1.1.困扰问题随着IT技术在企业中的应用越广&#xff0c;企业业务流程的正常运作就越离不开IT部门的支持。IT在给企业业务带来效益的同时&#xff0c;也带来了成本和风险的 困扰&#xff0c;尤其是在某些特殊行业&#xff0c;例如电信、金融等行业…

一个本科生,只用了两年就拿下诺贝尔奖,拯救了无数糖尿病患者

全世界只有3.14 % 的人关注了青少年数学之旅早在三千五百年前&#xff0c;古埃及就已经有对糖尿病的描述&#xff0c;两千多年前&#xff0c;古希腊医生亚的阿勒特奥斯把这种主要症状为“排泄多且甜的尿液”的疾病命名为“Diabetes”&#xff0c;也就是糖尿病。几千年来&#x…

C#中使用jieba.NET、WordCloudSharp制作词云图

词云简介“词云”由美国西北大学新闻学副教授、新媒体专业主任里奇戈登&#xff08;Rich Gordon&#xff09;于2006年最先使用&#xff0c;是通过形成“关键词云层”或“关键词渲染”&#xff0c;对文本中出现频率较高的“关键词”的视觉上的突出。网上大部分文章介绍的是使用P…

js框架页弹出页面关闭

2019独角兽企业重金招聘Python工程师标准>>> <!-- lang: js --> function to(href) {if (top.location self.location) {//window.opener null;window.opener.location.reload();window.open(, _self);window.close();} else {window.location.href href;}…

[超享]linux共享3160命令

点击进入Linux超全的命令学习博客[url]http://my0451.blog.sohu.com/action/m_list-ebi_3f3e214792-c_622615/entry/[/url]转载于:https://blog.51cto.com/jankie/11433

php和web服务器,php与web服务器关系

在解析这个问题前&#xff0c;先要讲述一个概念&#xff0c;什么是cgi程序&#xff1f;1.什么是cgi程序&#xff0c;cgi与fastcgi的区别CGI的中文名称是通用网关接口&#xff0c;是外部应用程序与web服务器之间的接口标准。CGI规范允许web服务器执行外部程序&#xff0c;并将它…

股市红涨绿跌色系定义真的是中国特色吗?

20080809 郑昀玩聚 与G共舞刚才发表的《适应中国特色 谷歌财经图标改绿色为红色.》&#xff0c;提及“在其他证券交易所&#xff0c;股市上涨都是使用绿色&#xff0c;下跌使用红色&#xff0c;唯独中国大陆的沪深股市&#xff0c;颜色显示相反”。 一.并非独此一家 实际上&…

狂言50年要拿30个诺奖的日本,如今怎么样了?

全世界只有3.14 % 的人关注了青少年数学之旅2019年10月9日&#xff0c;日本化学家吉野彰&#xff08;Akira Yoshino&#xff09;因在锂离子电池的发明和应用领域做出的卓越贡献&#xff0c;与美国科学家 John B. Goodenough、英国科学奖 M. Stanley Whittingham 一起荣获2019年…

VS2022+.NET6+C#10,.NET开发起飞

VS2022.NET6C#10一起体验是啥感觉&#xff1f;爽&#xff01;令人印象深刻的是VS2022打开超大项目的流畅&#xff0c;.NET6极致简化的MiniAPI框架&#xff0c;C#10各种炫酷新语法。看看下图的代码你能认识吗&#xff1f;来自.NET6的MiniAPI框架&#xff0c;直接在MapGet里面使用…

jdk8之lambda

2019独角兽企业重金招聘Python工程师标准>>> Oracle号称今年一定发布jdk8, 即使有bug, jdk8无疑最大的宠儿就是lambda表达式了&#xff0c;还是直接上代码&#xff0c;看看lambda表达式怎么了。 环境&#xff1a; openjdk8, eclipse4.3.1(支持jdk8编译) 实例代码&…

【转】Asp.Net中Excel操作权限的问题

近日在打开原来写的一个网页程序运行时&#xff0c;出现了Excel操作权限的问题&#xff0c;具体的说就是在代码中调用下面这段与Excel操作有关的语句时 Application curExcelApp new ApplicationClass(); 提示权限不足&#xff0c;具体的提示内容如下&#xff1a; 检索 COM 类…

再一贴[亲爱的,我不小心怀孕了~!]

这是我们第一次见面的酒吧。我们在这里度过了多少个夜晚&#xff0c;有过多少美好的回忆。  可是4月1日那天&#xff0c;我的心情很沉重&#xff0c;很忧郁。我不知道&#xff0c;这个消息对于我&#xff0c;对于你&#xff0c;对于我们意味着什么。我是如此渴望而又恐惧。 …