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. ...
随机推荐
- 【GitHub】上传代码通用操作等(附下载单个文件夹或文件)
一.创建GitHub账号以及配置 参考我的另一篇文章:<[Mac系统 + Git]之上传项目代码到github上以及删除某个文件夹> 二.创建新的个人知识库 前面配置完之后,下面讲的再新建 ...
- 淘宝打单发货接口,淘宝打单发货API
许多做系统功能的小伙伴经常面对的一个功能是对接淘宝开放平台,在自己系统中进行打单发货. 但是,目前淘宝开放平台,已经关闭了相关的相关的权限申请,具体可查看相关公告.有需要这个权限的,可以站内信联系我, ...
- [Udemy] AWS Certified Data Analytics Specialty - 1.Collect
1. Connect Kinesis: 类似于Kafka, 分为 Data Streams(real time), Analytics, Firehose(near real time),区别是: o ...
- 入门指南 | Datavines 安装部署篇
摘要:本文主要介绍基于源码部署 Datavines 和执行检查作业,内容主要分为以下几个部分: 平台介绍 快速部署 运行数据质量检查作业 Datavines 的目标是成为更好的数据可观测性领域的开源项 ...
- 低代码 + BI 数字化转型如何助力制造业供应链协同?
引言 在当今快速变化的商业环境中,制造业面临着前所未有的挑战和机遇.全球化竞争.消费者需求的快速变化.技术创新的加速以及不断增加的成本压力,都要求制造企业不断提高其供应链的效率和灵活性.供应链协同作为 ...
- RxJS 系列 – 目录
请按顺序阅读 概念篇 Observable & Creation Operators Subject Observable to Subject (Hot, Cold, Warm, conne ...
- Azure 入门系列 (第三篇 Publish Web Application to VM)
本系列 这个系列会介绍从 0 到 1 搭建一个 Web Application 的 Server. 间中还会带上一些真实开发常用的功能. 一共 6 篇 1. Virtual Machine (VM) ...
- jQuery - 不同版本的差异對比
jQuery 一共分了 1.x.2.x.3.x 这三个大版本. jQuery 的版本都是不向后兼容的! jQuery 的版本都是不向后兼容的! jQuery 的版本都是不向后兼容的!重要的事情说三遍哈 ...
- GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.7.0发布 新增各项优化与BUG修复
前言 时隔大半年,终于抽出空来可以更新这个组件了 (边缘化了,大概要被裁员了) 2.7.0终于发布了~ 更新内容: 1.添加API类任务的超时时间,可以通过全局配置也可以单个任务设置 2.设置定时任务 ...
- 第6天:基础入门-抓包技术&HTTPS协议&APP&小程序&PC应用&WEB&转发联动
安装charles 到Windows本地: 安卓模拟器安装: 如果抓模拟器就要使用从远程主机,如果不是,则从所有进程 访问 谷歌浏览器安装证书: PC微信小程序代理抓取: 41:43 :如何将char ...