.net 使用阿里云RocketMQ

1.首先我们来讲解一下消息队列的作用

比如说我们的订单系统,再客户订单生成了以后,可能会有

快递系统,通知系统,和打印系统需要用到当前订单的详细内容

所以这个时候常规的操作是在A里面通过代码调用B,C  ,D系统的接口来通知他们有新订单了

 

如果此时有个E系统呢

那我们的做法可能只能在A系统中增加代码来通知E系统,但是如果后期我们的E系统又不要了呢,岂不是我们又要在A系统中去除掉这一部分代码所以说这样的代码冗余就很高,对后期的性能也很有影响,因为系统A中通知B,C,D系统还要判断 B,C,D返回值中是否成功,如果没有成功还要子再次请求这样系统性能就非常的低下

所以说我们使用了MQ来解决这个问题

我们A系统秩序通知MQ系统 后面的B,C,D要信息的话直接找MQ系统调用就行

接下来我这里讲解下如何把MQ集成到.net 项目中

 

生产者端:

using Aliyun.MQ;
using Aliyun.MQ.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace CSDNSign.Controllers
{[Route("api/[controller]")][ApiController]public class MQController : ControllerBase{readonly IFreeSql _sql;private readonly ILogger<MQController> _logger;private const string _endpoint = "*************";// AccessKey ID阿里云身份验证,在阿里云服务器管理控制台创建。private const string _accessKeyId = "*************";// AccessKey Secret阿里云身份验证,在阿里云服务器管理控制台创建。private const string _secretAccessKey = "*************";// 所属的Topic。private const string _topicName = "xsw";// Topic所属实例ID,默认实例为空。private const string _instanceId = "*************";private static MQClient _client = new Aliyun.MQ.MQClient(_accessKeyId, _secretAccessKey, _endpoint);static MQProducer producer = _client.GetProducer(_instanceId, _topicName);/// <summary>/// /// </summary>/// <param name="sql"></param>/// <param name="logger"></param>public MQController(IFreeSql sql, ILogger<MQController> logger){_sql = sql;_logger = logger;}#region /// <summary>/// /// </summary>/// <param name="json"></param>/// <param name="key"></param>/// <param name="tag"></param>/// <returns></returns>[HttpPost][Route("TestMQ")]public string TestMQ(string json, string key, string tag){try{TopicMessage sendMsg = new TopicMessage(json);// 设置属性。sendMsg.PutProperty("a", "a");// 设置Key。sendMsg.MessageKey = key;TopicMessage result = producer.PublishMessage(sendMsg);return JsonConvert.SerializeObject(result) ;}catch (Exception ex){return  ex.Message.ToString();}}#endregion}
}

 

其中的endpoint可以在阿里云中接入点中查看

由于我们用的http的方式接受所以我们复制下面的地址

 

消费者端:

using Aliyun.MQ;
using Aliyun.MQ.Model;
using Aliyun.MQ.Model.Exp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Permissions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WPFTest
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{private const string _endpoint = "********";// AccessKey ID阿里云身份验证,在阿里云服务器管理控制台创建。private const string _accessKeyId = "*****";// AccessKey Secret阿里云身份验证,在阿里云服务器管理控制台创建。private const string _secretAccessKey = "*****";// 所属的Topic。private const string _topicName = "*****";// Topic所属实例ID,默认实例为空。private const string _instanceId = "*******";private const string _groupId = "*********";private static MQClient _client = new Aliyun.MQ.MQClient(_accessKeyId, _secretAccessKey, _endpoint);static MQConsumer consumer = _client.GetConsumer(_instanceId, _topicName, _groupId, null);private Thread thread;public MainWindow(){InitializeComponent();this.button_Stop.IsEnabled = false;}private void button_Click(object sender, RoutedEventArgs e){thread = new Thread(new ThreadStart(TaskStart));thread.IsBackground = true;thread.Start();this.button_get.IsEnabled = false;this.button_Stop.IsEnabled = true;}/// <summary>/// 开始任务/// </summary>private void TaskStart(){Dispatcher.Invoke(() => this.textBox.Text = "====== 开始获取MQ任务 ====== \n");// 在当前线程循环消费消息,建议多开个几个线程并发消费消息。while (true){try{// 长轮询消费消息。// 长轮询表示如果Topic没有消息,则请求会在服务端挂起3s,3s内如果有消息可以消费则立即返回客户端。List<Message> messages = null;try{messages = consumer.ConsumeMessage(3, // 一次最多消费3条(最多可设置为16条)。3  // 长轮询时间3秒(最多可设置为30秒)。);}catch (Exception exp1){if (exp1 is MessageNotExistException){Dispatcher.Invoke(() => textBox.Text += string.Format(Thread.CurrentThread.Name + " No new message, " + ((MessageNotExistException)exp1).RequestId + "\n"));continue;}Console.WriteLine(exp1);Thread.Sleep(2000);}if (messages == null){continue;}List<string> handlers = new List<string>();List<string> mqmessage = new List<string>();Console.WriteLine(Thread.CurrentThread.Name + " Receive Messages:");// 处理业务逻辑。foreach (Message message in messages){Console.WriteLine(message);Console.WriteLine("Property a is:" + message.GetProperty("a"));handlers.Add(message.ReceiptHandle);mqmessage.Add(message.Body);}// Message.nextConsumeTime前若不确认消息消费成功,则消息会被重复消费。// 消息句柄有时间戳,同一条消息每次消费拿到的都不一样。try{consumer.AckMessage(handlers);Console.WriteLine("Ack message success:");foreach (string handle in mqmessage){Dispatcher.Invoke(() => textBox.Text += handle + "\n");}Console.WriteLine();return;}catch (Exception exp2){// 某些消息的句柄可能超时,会导致消息消费状态确认不成功。if (exp2 is AckMessageException){AckMessageException ackExp = (AckMessageException)exp2;Console.WriteLine("Ack message fail, RequestId:" + ackExp.RequestId);foreach (AckMessageErrorItem errorItem in ackExp.ErrorItems){Dispatcher.Invoke(() => textBox.Text += string.Format("\tErrorHandle:" + errorItem.ReceiptHandle + ",ErrorCode:" + errorItem.ErrorCode + ",ErrorMsg:" + errorItem.ErrorMessage));}}}}catch (Exception ex){Console.WriteLine(ex);Thread.Sleep(2000);}}}private void button_Clean_Click(object sender, RoutedEventArgs e){this.textBox.Text = "";}private void button_Stop_Click(object sender, RoutedEventArgs e){this.button_get.IsEnabled = true;this.button_Stop.IsEnabled = false;thread.Interrupt();// Wait for newThread to end.//thread.Join();}}
}

 最后项目效果如下所示:

 

 

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

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

相关文章

tensorflow 目标分割_Tensorflow中的控制流和优化器

控制流只要对tensorflow有一点了解&#xff0c;都应该知道graph是tensorflow最基本的一个结构。Tensorflow的所有计算都是以图作为依据的。图的nodes表示一些基本的数学运算&#xff0c;比如加法&#xff0c;卷积&#xff0c;pool等。Node使用protoBuf来进行描述&#xff0c;包…

Reflector 已经out了,试试ILSpy

Reflector是.NET开发中必备的反编译工具。即使没有用在反编译领域&#xff0c;也常常用它来检查程序集的命名规范&#xff0c;命名空间是否合理&#xff0c;组织类型的方法是否需要改善。举例说明&#xff0c;它有一个可以查看程序集完整名称的功能&#xff0c;请看下图 这里的…

Go语言通过odbc驱动连接华为高斯数据库

1.下载odbc驱动 下载后安装psqlodbc_x64.msi 安装成功后可在odbc数据源中看到以下内容 2.测试odbc驱动 在用户dsn中选择添加 输入对应的连接内容点击test 如果显示以下内容则表示驱动正常可使用odbc连接高斯数据库 3.go 语言编写 其中依赖包需要使用命令安装 go get github.c…

activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

1&#xff09;实验平台&#xff1a;正点原子领航者ZYNQ开发板2&#xff09;平台购买地址&#xff1a;https://item.taobao.com/item.htm?&id6061601087613&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.htm…

.net Redis缓存优化提高加载速度和服务器性能(一)

距离上次服务器将图片转义至oss服务器提交加载速度已经有一段时日了 对于图片转移至oss服务器优化前后的结果可以查看我之前编写的文章点击查看 如今随着商户数的增多&#xff0c;数据的增多&#xff0c;服务器的性能再一次达到了顶峰&#xff0c;并且由于是点餐系统的缘故订…

火星人谚语系列之六:一次真实应用

总目录&#xff1a;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff0c;之八这是2011年7月的一次QQ群对话记录&#xff0c;做了匿名化处理&#xff0c;并重新调整了顺序&#xff0c;以便于阅读。对话的开始&am…

ubuntu 启动图形界面命令_Windows 10 远程连接 Ubuntu 18.04 Server图形界面

目录 0. 环境信息和说明Ubuntu 18.04上安装xrdp远程ubuntu-desktop桌面服务Ubuntu 18.04上安装xrdp远程Xfce桌面服务Ubuntu 18.04上安装vnc远程Xfce桌面服务0.环境信息和说明-----------Ubuntu版本# cat /etc/os-releaseNAME"Ubuntu"VERSION"18.04.3 LTS (Bioni…

动态条形图(RunBargraph)用于数据展示

最近公司项目需要做各种图标展示&#xff0c;用了Echarts的条形图和柱状图&#xff0c;但是老板还是觉得不够生动&#xff0c;看来时候祭出大招了 由此衍生在空余时间写下了此篇博客&#xff0c;首先还是看效果图: 注意&#xff0c;此图中数据并非真实数据&#xff0c;只是为…

网页实现凭证金额分割线_一位整理过5000个网页书签的大神分享:实用的书签管理方案...

我们在日常使用使用搜索引擎的过程中&#xff0c;会逐渐累积各式各样丰富的网站。而当我们保存的书签过多的时候&#xff0c;如果没有一套实用的管理方案&#xff0c;就会造成书签混乱&#xff0c;加大我们搜索的难度。所以&#xff0c;下面跟大家分享一套实用的书签管理方案&a…

【Python基础】11_Python中的字符串

1.字符串的定义 可以使用""双引号&#xff0c;也可以使用单引号定义字符串&#xff0c;一般使用双引号定义。 2.字符串的操作 判断类型&#xff1a; 查找和替换 大小写切换&#xff1a; 文本对齐 注&#xff1a;string.center(weight,str) 以str填充对齐&#xff0c;…

C# 淘宝商品微信返利助手开发-(一)返利助手原理

系列教程一目录&#xff1a;返利助手原理 系列教程二目录&#xff1a;返利助手开放文档以及帐号申请地址 系列教程三目录&#xff1a;返利助手开发&#xff08;1&#xff09;API介绍 系列教程四目录&#xff1a;返利助手开发&#xff08;2&#xff09;淘宝分享的内容如何只取…

c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了

我有相当长的一段时间(数月)没有更新文章了。并不是我放弃了写技术文章&#xff0c;而是因为这段时间&#xff0c;我把精力主要放在了图像智能算法的学习上了。去年12月时&#xff0c;我对图像智能算法还懵懵懂懂&#xff0c;做着 Linux 嵌入式应用程序开发&#xff0c;现在我已…

Burp破解安装(1.7和2.0)

依赖 由于Brup是使用java语言开发的&#xff0c;因此我们需要本地有jdk8的环境&#xff0c;教程自己百度或者<a href"https://www.runoob.com/java/java-environment-setup.html">https://www.runoob.com/java/java-environment-setup.html</a>&#xff…

C# ASP.NET MVC 微信和支付宝H5支付开发及Demo

微信和支付宝H5支付 最近开发任务遇到了一个要在手机浏览器里面调起微信和支付宝去支付的开发需求&#xff0c;以前都是做的扫码支付或者JSAPI都是在软件内部支付的&#xff0c;没遇到过在自己浏览器内唤醒微信或者支付宝的支付这种开发在开发的过程中遇到了许多问题和坑点这里…

dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复

常见错误解读823错误错误信息是&#xff1a;“在文件%ls中、偏移量为%#016I64x的位置执行%S_MSG期间&#xff0c;操作系统已经向SQL Server返回了错误%ls。”“The operating systemreturned error %ls to SQL Server during a %S_MSGat offset %#016I64x in file %ls.”例如&a…

C# ASP.NET MVC 阿里云短信验证码Demo

相信大家在开发过程中又很多使用到验证码验证的功能&#xff0c;今天将验证码的验证整理一下写了一个Demo 通过本篇后你能学习到: 阿里云短信服务Drapper连接SQL Server进行增改操作JS前端倒计时 完成后效果如下: (一)首先我们要使用短信我们先注册短信服务所需的内容 1.首先…

mybatis generator生成example_[Springboot系列] SpringBoot与Mybatis结合

本文作者&#xff1a;cuifuanMybatis 是一个持久层ORM框架&#xff0c;负责Java与数据库数据交互&#xff0c;也可以简易理解为中介&#xff0c;相对于它&#xff0c;还有个中介是hibernate,不过在mybatis中sql语句的灵活性&#xff0c;可优化性比较强&#xff0c;这也是现在大…

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

目前&#xff0c;较为成熟的技术是采用laravelS组件&#xff0c;注意和laravel 区别laravelS多了一个大写的S&#xff0c;由于laravelS默认监听5200端口&#xff0c;所以laravel项目要做一些调整 例如&#xff1a; 静态文件引入的方式-----从静态资源服务器加载我们熟悉的js和c…

Linux上Oracle 11g安装步骤图解(超详细图文教程)附带导入数据和新建数据库教程

首先本文采用Docker方式快速在Linux上安装 目录 1.安装Docker容器 (1)登陆服务器&#xff0c;输入命令安装Docker容器 (2)安装完成后运行下列代码如果弹出Docker版本则表示安装成功 (3)启动Docker并设置跟随系统开机启动 (4)由于国内系统拉取国外镜像缓慢所以我们在开始安…

python中import sys_python import sys出错怎么办

当在pycharm中输入如下代码时&#xff1a;import sys 一、问题&#xff1a; sys下出现红色波浪线&#xff0c;按CtrlF1显示的信息为&#xff1a;no module named sys。 二、原因&#xff1a; 在装Python解释器时&#xff0c;我为了图方便装的是 Python 3.7.0a4 的embeddable版本…