专题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的更多相关文章

  1. Puppet学习笔记(CentOS6.3+Puppet3.01)

    Puppet学习笔记(CentOS6.3+Puppet3.01)  技术 Add comments Oct262012 下了决心,好好学习puppet,周末专门去参加一个puppet的培训,难得朋友那 ...

  2. openresty 学习笔记五:访问RabbitMQ消息队列

    openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...

  3. RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

    RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...

  4. 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解

    Ext.Net通过DirectEvents进行服务器端异步的事件处理.[Ext.Net学习笔记]02:Ext.Net用法概览.Ext.Net MessageBus用法.Ext.Net布局 中已经简单的 ...

  5. Duilib学习笔记《03》— 控件使用

    在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...

  6. 再起航,我的学习笔记之JavaScript设计模式01

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 在通 ...

  7. Fortran学习笔记:03 数组(Array)

    Fortran学习笔记目录 书接上回:Fortran学习笔记:02 流控制语句 数组(Array) 定义数组 一维数组 program main implicit none integer :: i ...

  8. JavaSE学习笔记05面向对象编程01

    面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...

  9. 《Effective C++ 》学习笔记——条款03

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  10. Solr 6.7学习笔记(03)-- 样例配置文件 solrconfig.xml

    位于:${solr.home}\example\techproducts\solr\techproducts\conf\solrconfig.xml <?xml version="1. ...

随机推荐

  1. Python爬虫常用库介绍(requests、BeautifulSoup、lxml、json)

    1.requests库 http协议中,最常用的就是GET方法: import requests response = requests.get('http://www.baidu.com') pri ...

  2. maven 打包 pom build

    <dependencyManagement> <dependencies> <dependency> <groupId>org.springframew ...

  3. 啥是Session?

    什么是 Session 会话? 1.Session 就一个接口(HttpSession). 2.Session 就是会话.它是用来维护一个客户端和服务器之间关联的一种技术. 3.每个客户端都有自己的一 ...

  4. DB\redis\zookeeper分布式锁设计

    redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...

  5. Angular 18+ 高级教程 – Component 组件 の Template Binding Syntax

    前言 这篇介绍一些基本的 Angular 模板语法. 参考 Docs – Understanding binding Render.Event Listening and DOM Manipulati ...

  6. CSS & JS Effect – Styling Input Radio

    原生 Radio 的 Limitation <input type="radio" style="width: 25px; height: 25px; cursor ...

  7. 邀请参与 2022 第三季度 Flutter 开发者调查

    自 Flutter 3 发布之后,我们在以移动端为中心到多平台框架的路线上稳步前行,用 Dart 2.17 的新语言特性帮助大家提升工作效率,并对核心工具进行了改进,让您在跨平台打造优秀体验时更加得心 ...

  8. 【赵渝强老师】MongoDB中的索引(上)

    索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中, ...

  9. Linux中的一些命令

    1.新增新用户lili,不允许登录系统,用户ID为3000===useradd -u 3000 -s /sbin/nologin lili2.循环创建目录 /www/wwwroot/html/test ...

  10. USB2.0设备的休眠挂起及远程唤醒

    USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态.所谓可见,即 ...