EasyNetQ 项目应用(1) | .net 控制台实践

1 $ 准备前提

前面两篇我们对 EasyNetQ 做了简单介绍,访问地址如下:

接下来我们基于 RabbitMQ 中的常用协议(direct、topic、fanout)实现在 .net5 控制台项目中的操作,此处主要是使用【NetServices.Helper.RabbitMQ】包编写案例。

1.1 环境准备条件

  • RabbitMQ 下载
  • RabbitMQ 安装
    • 先安装 erlang
    • 然后再安装 rabbitmq
  • NuGet 包
    • NetServices.Helper.RabbitMQ =》Install-Package NetServices.Helper.RabbitMQ -Version 1.0.1
  • 项目环境
    • Microsoft Visual Studio Enterprise 2019 版本 16.9.3+
    • .NET 5.0 控制台应用程序 <TargetFramework>net5.0</TargetFramework>

nuget =》NuGet Gallery | Home ,安装参考 =》【RabbitMQ学习笔记:安装与配置

1.2 RabbitMQ 客户端组件包:NetServices.Helper.RabbitMQ

【NetServices.Helper.RabbitMQ】包是基于【EasyNetQ v6.3.2】封装的,使用 .net5 平台的类库实现,版本v1.0.2;接下来我们按照 RabbitMQ 中的协议(direct、topic、fanout)逐一讲解。

上面的环境安装好后,RabbitMQ 默认会有一个【admin】账户,下面的演示我们均使用该默认账户进行相关数据通信操作;

2 $ 控制台项目搭建

为了体现 RabbitMQ 的角色概念,创建两个【控制台应用程序】项目分别为:生产者【Producer.ConsoleApp.Test】和消费者【Consumer.ConsoleApp.Test】角色扮演;然后依次在每个项目中引入 nuget 包【NetServices.Helper.RabbitMQ】,项目环境基本搭建ok,接下来我们介绍怎么使用【NetServices.Helper.RabbitMQ】包实现(direct、topic、fanout)协议的消息发送和消费的数据通信;

2.1 Fanout Exchange(广播模式)

此处链接 RabbitMQ 的格式如下:

private static readonly string mqConnStr = "host=192.168.10.27;virtualHost=/;username=admin;password=admin";

此处要说明一点,在该组件包中,提供两类 RabbitMQ 的客户端操作方式,分别如下:

  • RabbitMQClientFactory (单例模式 + 享元模式)
  • RabbitMQClientHelper (单例模式)

控制台的 Main 函数中代码示例分别如下:

// 消息发送【Producer.ConsoleApp.Test】
var player = RabbitMQClientFactory.GetInstance().GetRabbitMQClientRolePlayer<MsgProducer>("producer");
var mqClient = player.BuildRolePlayer();
var bus = player.CreateBus(mqConnStr);
while (true)
{
    string msg = Console.ReadLine();
    var (state, info) = mqClient.FanoutPublish(bus, "fanoutExchange", "fanoutRKey1", msg);
    if (!state) Console.WriteLine(info); //输出异常信息

    Thread.Sleep(200);
}

// 消息消费【Consumer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
    var (state, info) = mqClientHelper.Consumer.FanoutConsume<string>(bus, "fanoutExchange", "fanoutQueue1", "fanoutRKey1", (handler) => {
        Console.WriteLine(handler); //接收消息
    });
    if (!state) Console.WriteLine(info); //输出异常信息

    Thread.Sleep(200);
}

【NetServices.Helper.RabbitMQ】包提供的两种对象操作模式均可使用,使用区别如上代码中,发送消息使用 RabbitMQClientFactory 对象,消费消息使用 RabbitMQClientHelper,当然也可以调换执行或者全部都使用一个对象操作,此处只是客户端操作对象的一个 “多态” 模式,小伙伴喜欢哪个就使用哪个,不必纠结于此。

2.2 Direct Exchange (路由推送模式)

此处为了掩饰,我们把上面模式的客户端操作对象对调下,实现 Direct 模式的消息通信,控制台的 Main 函数中代码示例分别如下:

// 消息发送【Producer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
    string msg = Console.ReadLine();
    //var (state, info) = mqClientHelper.Producer.DirectSend(bus, "directQueue1", msg);
    var (state, info) = mqClientHelper.Producer.DirectPublish(bus, "directExchange", "directRKey1", msg);
    if (!state) Console.WriteLine(info);

    Thread.Sleep(200);
}

// 消息消费【Consumer.ConsoleApp.Test】
var player = RabbitMQClientFactory.GetInstance().GetRabbitMQClientRolePlayer<MsgConsumer>("consumer");
var mqClient = player.BuildRolePlayer();
var bus = player.CreateBus(mqConnStr);
while (true)
{
    //var (state, info) = mqClientHelper.Consumer.DirectReceive<string>(bus, "directQueue1", (callback)=> {
    //    Console.WriteLine(callback);
    //});

    var (state, info) = mqClient.DirectConsume<string>(bus, "directExchange", "directQueue1", "directRKey1", (callbackHandler) => {
        Console.WriteLine(callbackHandler);
    });
    if (!state) Console.WriteLine(info);

    Thread.Sleep(200);
}

2.3 Topic Exchange (主题[模糊]匹配/订阅模式)

上面 Direct 模式的消息通信演示了两个客户端对象的对调,接下来的 Topic 模式的消息通信我们均采用一个对象来实现,控制台的 Main 函数中代码示例分别如下:

// 消息发送【Producer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
    string msg = Console.ReadLine();
    //var (state, info) = mqClientHelper.Producer.TopicPublish(bus, "topic1", msg);
    var (state, info) = mqClientHelper.Producer.TopicAdvancedPublish(bus, "topic2", "topicExchange", msg);

    if (!state) Console.WriteLine(info);

    Thread.Sleep(200);
}

// 消息消费【Consumer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
    //var (state, info) = mqClientHelper.Consumer.TopicSubscribe<string>(bus, "subTopic1", (callbackHandler) => {
    //    Console.WriteLine(callbackHandler);
    //},"topic1");

    var (state, info) = mqClientHelper.Consumer.TopicAdvancedConsume<string>(bus, "topicExchange", "subTopic2", (callbackHandler) =>
    {
        Console.WriteLine(callbackHandler);
    }, "topic2");

    if (!state) Console.WriteLine(info);

    Thread.Sleep(200);
}

3 $ 两种客户端模式的简单介绍

  • RabbitMQClientFactory 对象是单例模式和享元模式的结合实现,提供对 RabbitMQ 客户端的相关操作;

  • RabbitMQClientHelper 对象是单例模式的实现,提供对 RabbitMQ 客户端的相关操作;

4 $ 生产者和消费者提供方法简单介绍

  • 消息生产者:MessageProducer

  • 消息消费者:MessageConsumer

以上通信模式中我们使用 string 字符串类型来演示的消息通信,同样可以使用提供的模型实现各种类型的消息通信,消息模型中提供如下:

  • public class EntityMessage<TData> where TData : class
  • public class FormatMessage<TData> where TData : class

我们只需将发送消息和接收消息采用模型构建即可,提供的 <TMsg> 的泛型参数,有兴趣的小伙伴可以自行去尝试,此处就不做过多的说明演示(都是类似的🎈🎈🎈)

以上就是关于【NetServices.Helper.RabbitMQ】包的简单介绍和使用,希望能通过上面的案例,在实际项目应用中帮助到更多的小伙伴,~~~///(^v^)\\\~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值