dotnet学习笔记-专题03-RabbitMQ-01
专题03——RabbitMQ
1. RabbitMQ安装
服务端
使用如下sh脚本安装:
#!/bin/sh
sudo apt-get install curl gnupg apt-transport-https -y
## Team RabbitMQ's main signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
## Community mirror of Cloudsmith: modern Erlang repository
curl -1sLf https://ppa1.novemberain.com/gpg.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
## Community mirror of Cloudsmith: RabbitMQ repository
curl -1sLf https://ppa1.novemberain.com/gpg.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
## Add apt repositories maintained by Team RabbitMQ
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
## Provides RabbitMQ
##
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
EOF
## Update package indices
sudo apt-get update -y
## Install Erlang packages
sudo apt-get install -y erlang-base \
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing
配置文件在/etc/rabbitmq中,通过rabbitmq-env.conf配置环境,rabbitmq-env.conf如下:
export RABBITMQ_NODENAME=rabbit@localhost
export RABBITMQ_NODE_IP_ADDRESS=127.0.0.1
export ERL_EPMD_ADDRESS=127.0.0.1
客户端
使用NuGet安装RabbitMQ.Client
2. 接收者
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
// 工厂方法,用于配置连接
var factory = new ConnectionFactory
{
// RabbitMQ的服务端地址
HostName = SharedConfig.Configuration.HostName,
// 异步消费
DispatchConsumersAsync = true
};
// 建立连接
using var connection = factory.CreateConnection();
// 创建信道
var channel = connection.CreateModel();
// 注:XxxDeclare的意思是:没有就创建,有就复用(由于不知道是Sender还是Receiver先启动,所以都要声明)
// 声明交换机
channel.ExchangeDeclare(exchange: SharedConfig.Configuration.ExchangeName,
type: SharedConfig.Configuration.ExchangeType);
// 声明队列
channel.QueueDeclare(queue: SharedConfig.Configuration.QueueName, durable: true, exclusive: false, autoDelete: false,
arguments: null);
// 将队列与交换机绑定
channel.QueueBind(queue: SharedConfig.Configuration.QueueName, exchange: SharedConfig.Configuration.ExchangeName,
routingKey: SharedConfig.Configuration.EventName);
// 从队列中获取消息(拉取模式)
var asyncEventingBasicConsumer = new AsyncEventingBasicConsumer(channel);
// 订阅Received事件
asyncEventingBasicConsumer.Received += OnMessageReceived;
// 确认队列中正在消费的事件状态(Ack或Reject)
channel.BasicConsume(queue: SharedConfig.Configuration.QueueName, autoAck: false, consumer: asyncEventingBasicConsumer);
Console.ReadLine();
async Task OnMessageReceived(object sender, BasicDeliverEventArgs args)
{
try
{
var bytes = args.Body.ToArray();
var message = Encoding.UTF8.GetString(bytes);
Console.WriteLine($"{DateTime.Now}: 收到了消息-{message}");
channel.BasicAck(args.DeliveryTag, multiple: false);
await Task.Delay(800);
}
catch (Exception e)
{
channel.BasicReject(args.DeliveryTag, true); // 失败重发
Console.WriteLine($"处理收到的消息出错,{e.Message}");
}
}
3. 发送者
using System.Globalization;
using System.Text;
using RabbitMQ.Client;
var connectionFactory = new ConnectionFactory
{
HostName = SharedConfig.Configuration.HostName,
DispatchConsumersAsync = true
};
// 和RabbitMQ建立TCP连接
using var connection = connectionFactory.CreateConnection();
// 每间隔3s将当前时间发送到队列当中去,共发送30次
for (int i = 0; i < 30; i++)
{
// 等待发送的消息
string message = DateTime.Now.ToString(CultureInfo.InvariantCulture);
// 将消息重新编码为RabbitMQ能够接受的格式(byte[])
var mqMessage = Encoding.UTF8.GetBytes(message);
// 创建信道
using (var channel = connection.CreateModel())
{
var properties = channel.CreateBasicProperties();
// 消息递送模式:持久化模式
properties.DeliveryMode = 2;
// 声明交换机
// 注:XxxDeclare的意思是:没有就创建,有就复用(由于不知道是Sender还是Receiver先启动,所以都要声明)
channel.ExchangeDeclare(exchange: SharedConfig.Configuration.ExchangeName,
type: SharedConfig.Configuration.ExchangeType);
// 发布消息
channel.BasicPublish(exchange: SharedConfig.Configuration.ExchangeName,
routingKey: SharedConfig.Configuration.EventName, mandatory: true,
basicProperties: properties, body: mqMessage);
}
Console.WriteLine($"发布了消息:{message}");
Thread.Sleep(3000);
}
4. 共用的配置类
namespace SharedConfig;
public struct Configuration
{
// RabbitMQ的地址,这里用本地地址和默认端口
public const string HostName = "localhost";
// 交换机名称
public const string ExchangeName = "exchange1";
// 交换机类型
public const string ExchangeType = "direct";
// 当作routingKey使用(路由的依据)
public const string EventName = "event1";
// 队列名称
public const string QueueName = "queue1";
}
dotnet学习笔记-专题03-RabbitMQ-01的更多相关文章
- Puppet学习笔记(CentOS6.3+Puppet3.01)
Puppet学习笔记(CentOS6.3+Puppet3.01) 技术 Add comments Oct262012 下了决心,好好学习puppet,周末专门去参加一个puppet的培训,难得朋友那 ...
- openresty 学习笔记五:访问RabbitMQ消息队列
openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...
- RabbitMQ学习笔记五:RabbitMQ之优先级消息队列
RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...
- 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解
Ext.Net通过DirectEvents进行服务器端异步的事件处理.[Ext.Net学习笔记]02:Ext.Net用法概览.Ext.Net MessageBus用法.Ext.Net布局 中已经简单的 ...
- Duilib学习笔记《03》— 控件使用
在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...
- 再起航,我的学习笔记之JavaScript设计模式01
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 在通 ...
- Fortran学习笔记:03 数组(Array)
Fortran学习笔记目录 书接上回:Fortran学习笔记:02 流控制语句 数组(Array) 定义数组 一维数组 program main implicit none integer :: i ...
- JavaSE学习笔记05面向对象编程01
面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...
- 《Effective C++ 》学习笔记——条款03
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- Solr 6.7学习笔记(03)-- 样例配置文件 solrconfig.xml
位于:${solr.home}\example\techproducts\solr\techproducts\conf\solrconfig.xml <?xml version="1. ...
随机推荐
- windows 误删除\AppData\Local\文件夹后 异常的修复
背景:清除Temp文件夹时,路径复制错误,少复制了Temp,导致删除了文件夹 C:\Users\username\AppData\Local\ 异常现象: 估计删除Local文件夹后,出现的问题应该会 ...
- el-submenu 设定title不显示
原因为 插槽中有空格 slot=" title" 修改为 slot="title"即可
- 【YashanDB知识库】outline固化执行计划
[问题分类]性能优化,功能使用 [关键字]outline [问题描述]防止SQL执行计划突变,用outline固化执行计划 [问题原因分析]防止SQL执行计划突变,用outline固化执行计划 [解决 ...
- Linq操作XML生成XML,实体生成XML和互转
开发接口中难免会遇到一些数据对接需要转换城xml,看到很多之前的代码都使用很传统的方法循环集合并定义xml后一一生成的,代码之封锁 特此使用了简单易用linq操作分享给大家,希望可以帮到需要的同学 今 ...
- 鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引
鸿蒙(Harmony) NEXT 9月份就要正式上架了,并且不会再兼容安卓平台,于是我也赶紧给App开发鸿蒙版本,接下来会写一系列的Harmony开发教程. 今天使用AlphabetIndexer实现 ...
- web前端使用mcg-helper代码生成工具学习笔记
学习资料介绍 github地址:mcg-helper代码生成工具 什么是 FreeMarker? - FreeMarker 中文官方参考手册 视频学习地址: 第一节.视频教程内容介绍 探讨研发工作 ...
- C++ 数据输入cin (解决CLoin输入中文程序出错)
数据输入cin 语法:cin >> 变量 解决 CLoin 使用cin输入中文程序无法正常运行 按住Ctrl+alt+shift+/键 弹出对话框选择注册表 取消勾选run.process ...
- Maven高级——依赖管理
依赖管理 依赖指向当前项目运行所需的jar包,一个项目可以设置多个依赖 依赖传递 依赖具有传递性 直接依赖:在当前项目中通过依赖配置建立的依赖关系 间接依赖:被依赖的资源如果依赖其他资源.当前项目间接 ...
- 八皇后dfs全排列——洛谷1219
[USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 \(6 \times 6\) 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括 ...
- Autodesk 3d Max2020 初始化闪退
事件起因:给同事安装完 Autodesk 3d Max2020 版本之后,软件初始化就闪退,后来在网上查了资料后解决. 解决办法如下:services.msc --> Autodesk 开头的服 ...