Quick.RabbitMQPlus.Furion 1.0.8

There is a newer version of this package available.
See the version list below for details.
dotnet add package Quick.RabbitMQPlus.Furion --version 1.0.8                
NuGet\Install-Package Quick.RabbitMQPlus.Furion -Version 1.0.8                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Quick.RabbitMQPlus.Furion" Version="1.0.8" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Quick.RabbitMQPlus.Furion --version 1.0.8                
#r "nuget: Quick.RabbitMQPlus.Furion, 1.0.8"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Quick.RabbitMQPlus.Furion as a Cake Addin
#addin nuget:?package=Quick.RabbitMQPlus.Furion&version=1.0.8

// Install Quick.RabbitMQPlus.Furion as a Cake Tool
#tool nuget:?package=Quick.RabbitMQPlus.Furion&version=1.0.8                

1、🍹更新日志

  • 1.0.8

    • 去掉了通过实体特性去配置各个属性,目的在于简化各个配置,都通过配置文件进行设置;

    • 在接收数据的时候,可以通过实体特性QuickRabbitMQPlusReceive去设置接收的消息队列(如**[QuickRabbitMQPlusReceive("TestRabbitMQName1")]),如果不要实体特性,那么就会通过配置中的QueueNames**属性去控制;

    • 对接收数据的方法进行了重载;

    • 配置中增加了Default属性,用于设置默认连接配置(如果配置中有多个连接配置,并且没有一个配置中设置Default为true,那么默认会使用第一个配置);

    • 配置中增加了PrefetchCount属性,用于全局设置RabbitMQ一次最多推送多少条消息给消费者,默认为10;

    • 配置中去掉了~~RouteKey~~配置,如果使用的是路由模式,请使用RouteKeys属性进行配置,前提是RouteKeysQueueNames集合的数量需要保持一致;

    • 实例化组件对象的时候,去掉了泛型的定义,如var sendInstance = QuickRabbitMQPlusInstance.Instance();

    • 发送和接收的方法,增加了泛型的定义,这样做的目的是不受限于在组件实例化的时候指定只能是某个泛型,将泛型的定义设置到方法上更灵活,如同一个组件实例化对象可发送不同的泛型实体数据。

  • 1.0.7

    • 去掉了必须要设置实体特性的控制(如果没有实体特性,那么就需要在配置文件中将相关属性配置齐全),默认使用的是配置中的第一个配置;

    • 在路由模式下,可指定将消息发送到对应的队列中,需要配置QueueNamesRouteKeys的集合数量保持一一对应的关系;

    • Send方法增加了第二个参数,路由Key名称;

    • 实例化对象的方法Instance增加了参数Instance(bool isReceive = false),当前实例化对象是否为接收消息。

  • 1.0.6

    • 新增加了可动态切换连接的方法ChangeConn

    • 去掉了Furion的依赖;

    • 去掉了Newtonsoft.Json的依赖;

    • 同时将原来的Quick.RabbitMQPlus分为了Quick.RabbitMQPlusQuick.RabbitMQPlus.Furion这两个版本。

2、🍟Quick.RabbitMQPlus.Furion使用说明

该组件是基于RabbitMQ.ClientFurion组件进行封装使用的,目的在于集合.Net Core更快、更简单和更灵活的使用RabbitMQ!!!

功能说明:

  • 支持发布订阅模式路由模式,通配符模式Headers属性模式

  • 可根据配置文件读取RabbitMQ连接的各个配置(如:RabbitMQ服务地址、账号、密码和交换机名称等);

  • 支持配置多个RabbitMQ的连接配置;

  • 支持动态切换RabbitMQ的连接配置;

  • 可根据实体定义的特性发布和订阅消息(已废弃),目前只针对接收消息定义了实体特性,并且只能指定接收消息的队列_(v1.0.8调整)_;

  • 支持配置将多个队列绑定到交换机;

  • 一个消费端支持可以同时消费多个多列的消息等;

  • 支持使用同一个实体,将不同的消息发送到不同的队列中(使用路由模式,同时在发送的时候将路由Key传入);

  • 支持全局设置接收消息一次性接收多少条的配置_(v1.0.8新增)_。

3、🍖安装

安装命令如下所示:

Install-Package Quick.RabbitMQPlus.Furion

4、🧀生产端

4.1、🥞配置appsettings.json

appsettings.json配置文件中创建节点QuickRabbitMQPlus>PrefetchCountQuickRabbitMQPlusConfigs,PrefetchCount为设置RabbitMQ一次最多推送多少条消息给消费者(默认为10),QuickRabbitMQPlusConfigs 为数组类型(即可配置多个 RabbitMQ 服务地址),具体配置如下所示:

{
    "QuickRabbitMQPlus": {
        "PrefetchCount": 1,
        "QuickRabbitMQPlusConfigs": [
            {
                "Default": false,
                "ConnId": 1,
                "UserName": "quber",
                "Password": "0807_quberONE",
                "HostName": "127.0.0.1",
                "Port": 5672,
                "ExchangeType": "direct",
                "ExchangeName": "TestExchangeName",
                "QueueNames": [ "TestRabbitMQName1", "TestRabbitMQName2" ],
                "RouteKeys": [ "TestRouteKey1", "TestRouteKey2" ], //ExchangeType=direct才起作用,并且和QueueNames一一对应
                //"ExchangeDurable": true,
                //"QueueDurable": true,
                //"MessageDurable": true
            },
            //fanout模式
            {
                "Default": true,
                "ConnId": 2,
                "UserName": "quber",
                "Password": "0807_quberONE",
                "HostName": "127.0.0.1",
                "Port": 5672,
                "ExchangeType": "fanout",
                "ExchangeName": "TestExchangeName",
                "QueueNames": [ "TestRabbitMQName1", "TestRabbitMQName2" ],
                "RouteKeys": [ "TestRouteKey1", "TestRouteKey2" ], //ExchangeType=direct才起作用,并且和QueueNames一一对应
                //"ExchangeDurable": true,
                //"QueueDurable": true,
                //"MessageDurable": true
            }
        ]
    }
}

配置说明(消费端通用):

属性名称 属性说明 是否必填 备注
PrefetchCount 全局设置RabbitMQ一次最多推送多少条消息给消费者,默认为10 消费端才使用的属性
Default 是否为默认连接 默认为false
ConnId 连接Id(请确保该Id的唯一性) 如果要动态切换连接配置,请确保该Id有值并且唯一
UserName RabbitMQ连接账户
Password RabbitMQ连接密码
HostName RabbitMQ连接IP
Port RabbitMQ连接端口 不填就是默认端口5672
ExchangeType 交换机类型(fanout:发布订阅模式、direct:路由模式、topic:通配符模式、headers:属性匹配模式)
ExchangeName 交换机名称
QueueNames 队列名称集合(与交换机ExchangeName进行绑定) 此处为集合,目的是在发布消息时将消息存储到该队列集合中去
RouteKeys 路由名称集合(或通配符名称集合) ExchangeType=direct才起作用,并且和QueueNames是一一对应的关系,这样配置目的是可以实现将消息1发送到队列1,将消息2发送到队列2
ExchangeDurable 交换机是否持久化,默认为true 如果采用默认的设置,配置文件可以不要该属性
QueueDurable 队列是否持久化,默认为true 如果采用默认的设置,配置文件可以不要该属性
MessageDurable 消息是否持久化,默认为true 如果采用默认的设置,配置文件可以不要该属性

4.2、🍞配置Program.cs

由于我们使用的是Furion,因此,我们可在程序启动文件中配置如下代码(具体可参考Furion入门指南),目的是注册配置选项QuickRabbitMQPlusOptions

Serve.Run(RunOptions.DefaultSilence.ConfigureBuilder(builder =>
{
	//注册RabbitMQ连接配置对象
	builder.Services.AddConfigurableOptions<QuickRabbitMQPlusOptions>();
}).Configure(app =>
{
}));

4.3、🧀定义发送消息实体

如下所示我们可以定义一个消息实体:

namespace Quick.RabbitMQPlus.Publisher
{
    public class TestRabbitMQModel
    {
        public int UserId { get; set; }

        public string UserName { get; set; }

        public int UserAge { get; set; }

        public DateTime CreateTime { get; set; }
    }
}

4.4、🥐发送消息Demo

如下所示为具体的发送消息代码:

发送单条消息(fanout模式):

//定义发送对象
var sendInstance = QuickRabbitMQPlusInstance.Instance();

//发送10条数据
for (int i = 0; i < 10; i++)
{
	var msgModel = new TestRabbitMQModel
	{
		UserId = rand.Next(1, 9999),
		UserName = "Quick" + (i + 1),
		UserAge = rand.Next(20, 80),
		CreateTime = DateTime.Now
	};

	var sendRet = await sendInstance.Send(msgModel);

	if (sendRet.Item1)
	{
		//发送成功
	}
	else
	{
		//发送失败
		var errMsg = $"失败原因:{sendRet.Item2}";
	}

	//间隔2秒发送一次
	await Task.Delay(2000);
}

//消息发送完成后,关闭通道
sendInstance.Close();

发送单条消息(direct模式):

//当i % 2为0时,发送给路由TestRouteKey1对应的队列TestRabbitMQName1,否则发送给路由TestRouteKey2对应的队列TestRabbitMQName2
//此处就实现了在路由模式下,将不同的消息发送给不同的队列
//需要注意的时候,此方式需要将交换机类型配置为direct路由模式,同时需要设置配置的QueueNames和RouteKeys属性(这两属性的集合数量需要保持一致,一一对应的关系)
var sendRet = await _sendInstance.Send(msgModel, i % 2 == 0 ? "TestRouteKey1" : "TestRouteKey2");

发送多条消息:

var sendList = new List<TestRabbitMQModel>{
	new TestRabbitMQModel(),
	new TestRabbitMQModel()
};

var sendRet = await sendInstance.Send(sendList);

切换连接:

//切换到connId=2的配置
_sendInstance.ChangeConn(2);

var sendRetConn2 = await _sendInstance.Send(msgModel);

//切换到connId=3的配置
_sendInstance.ChangeConn(3);

var sendRetConn3 = await _sendInstance.Send(msgModel);

5、🥪消费端

5.1、🍝配置appsettings.json与实体特性QuickRabbitMQPlusReceive

  • 配置说明:

    具体配置请参见生产端(和生产端完全一致)。

    需要注意的是,消费端中,增加了PrefetchCount配置,目的用于全局设置 RabbitMQ 一次最多推送多少条消息给消费者,默认为 10。

    需要注意的是,如果消费端中的QueueNames属性设置了多个队列,就代表该消费端同时接收多个队列的消息

  • 实体特性配置说明(消费端使用):

    属性名称 属性说明 是否必填 备注
    queueName 队列名称(多个队列名称请使用英文逗号,分隔) 如果同时设置了实体特性的队列名称和配置中的_QueueNames_属性,那么会优先采用实体的队列名称

    如下所示:

    namespace Quick.RabbitMQPlus.Publisher
    {
        [QuickRabbitMQPlusReceive("TestRabbitMQName1")]
        //[QuickRabbitMQPlusReceive("TestRabbitMQName1,TestRabbitMQName2")]
        public class TestRabbitMQModel
        {
            public int UserId { get; set; }
    
            public string UserName { get; set; }
    
            public int UserAge { get; set; }
    
            public DateTime CreateTime { get; set; }
        }
    }
    

5.2、🌮配置Program.cs

由于我们使用的是Furion,因此,我们可在程序启动文件中配置如下代码(具体可参考Furion入门指南),目的是注册配置选项QuickRabbitMQPlusOptions

Serve.Run(RunOptions.DefaultSilence.ConfigureBuilder(builder =>
{
	//注册RabbitMQ连接配置对象
	builder.Services.AddConfigurableOptions<QuickRabbitMQPlusOptions>();
}).Configure(app =>
{
}));

5.3、🧆定义接收消息实体

如下所示我们可以定义3个消息实体(第一个用于接收队列TestRabbitMQName1的消息,第二个用于接收队列TestRabbitMQName2的消息,第三个用于接收队列TestRabbitMQName1TestRabbitMQName2):

namespace Quick.RabbitMQPlus.Consumer
{
    [QuickRabbitMQPlusReceive("TestRabbitMQName1")]
    public class TestRabbitMQModel1
    {
        public int UserId { get; set; }

        public string UserName { get; set; }

        public int UserAge { get; set; }

        public DateTime CreateTime { get; set; }
    }
}
namespace Quick.RabbitMQPlus.Consumer
{
    [QuickRabbitMQPlusReceive("TestRabbitMQName2")]
    public class TestRabbitMQModel2
    {
        public int UserId { get; set; }

        public string UserName { get; set; }

        public int UserAge { get; set; }

        public DateTime CreateTime { get; set; }
    }
}
namespace Quick.RabbitMQPlus.Consumer
{
    [QuickRabbitMQPlusReceive("TestRabbitMQName1,TestRabbitMQName2")]
    public class TestRabbitMQModel3
    {
        public int UserId { get; set; }

        public string UserName { get; set; }

        public int UserAge { get; set; }

        public DateTime CreateTime { get; set; }
    }
}

5.4、🍨接收消息Demo

定义两个消费端,一个消费端消费一个队列,具体的接收消息代码如下所示(接收单条消息):

//接收队列1的消息
var retRec1 = await QuickRabbitMQPlusInstance.Instance(true).Receive<TestRabbitMQModel1>(async (data, msg) =>
{
    await Task.Delay(1000);

    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine($"\r\n队列1消息:{msg}");

    //返回true代表业务逻辑处理成功,会告知MQ这条消息已经接收成功,会从MQ队列中删除
    //返回false代表业务逻辑处理失败,会告知MQ这条消息没有处理成功,则MQ会继续推送这条消息
    return true;
});
if (!retRec1.Item1)
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine($"\r\n队列1接收失败:{retRec1.Item2}");
}

//接收队列2的消息
var retRec2 = await QuickRabbitMQPlusInstance.Instance(true).Receive<TestRabbitMQModel2>(async (data, msg) =>
{
    await Task.Delay(2500);

    Console.ForegroundColor = ConsoleColor.Magenta;
    Console.WriteLine($"\r\n队列2消息:{msg}");

    //返回true代表业务逻辑处理成功,会告知MQ这条消息已经接收成功,会从MQ队列中删除
    //返回false代表业务逻辑处理失败,会告知MQ这条消息没有处理成功,则MQ会继续推送这条消息
    return true;
});
if (!retRec2.Item1)
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine($"\r\n队列2接收失败:{retRec2.Item2}");
}

定义一个消费端,同时消费两个队列,具体的接收消息代码如下所示(接收单条消息):

//接收队列1的消息
var retRec = await QuickRabbitMQPlusInstance.Instance(true).Receive<TestRabbitMQModel3>(async (data, msg) =>
{
    await Task.Delay(1000);

    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine($"\r\n队列1、2消息:{msg}");

    //返回true代表业务逻辑处理成功,会告知MQ这条消息已经接收成功,会从MQ队列中删除
    //返回false代表业务逻辑处理失败,会告知MQ这条消息没有处理成功,则MQ会继续推送这条消息
    return true;
});
if (!retRec.Item1)
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine($"\r\n队列1、2接收失败:{retRec.Item2}");
}

如果需要接收多条消息,请使用Receives方法:

//接收队列1的消息
var retRec = await QuickRabbitMQPlusInstance.Instance(true).Receives<TestRabbitMQModel3>(async (dataList, msg) =>
{
	//此处的dataList为List<TestRabbitMQModel3>
	
    return true;
});

注意:

如果是路由模式direct,需要在实例化对象方法中传入true,如下所示:

var retRec = await QuickRabbitMQPlusInstance.Instance(true).……

5.5、🍱预览效果

<div style="background:#000;padding:10px;"> <div><font color="DarkCyan">####消费端已启动####</div></br> <div><font color="Green">队列1消息:{"UserId":8739,"UserName":"CCCC1","UserAge":40,"CreateTime":"2022-09-06 10:44:37"}</div></br> <div><font color="Magenta">队列2消息:{"UserId":8739,"UserName":"CCCC1","UserAge":40,"CreateTime":"2022-09-06 10:44:37"}</div></br> <div><font color="Green">队列1消息:{"UserId":8646,"UserName":"CCCC2","UserAge":54,"CreateTime":"2022-09-06 10:44:39"}</div></br> <div><font color="Magenta">队列2消息:{"UserId":8646,"UserName":"CCCC2","UserAge":54,"CreateTime":"2022-09-06 10:44:39"}</div></br> <div><font color="Magenta">队列2消息:{"UserId":1966,"UserName":"CCCC3","UserAge":21,"CreateTime":"2022-09-06 10:44:41"}</div></br> <div><font color="Green">队列1消息:{"UserId":1966,"UserName":"CCCC3","UserAge":21,"CreateTime":"2022-09-06 10:44:41"}</div></br> <div><font color="Magenta">队列2消息:{"UserId":8349,"UserName":"CCCC4","UserAge":25,"CreateTime":"2022-09-06 10:44:43"}</div></br> <div><font color="Green">队列1消息:{"UserId":8349,"UserName":"CCCC4","UserAge":25,"CreateTime":"2022-09-06 10:44:43"}</div></br> <div><font color="Magenta">队列2消息:{"UserId":3770,"UserName":"CCCC5","UserAge":31,"CreateTime":"2022-09-06 10:44:45"}</div></br> <div><font color="Green">队列1消息:{"UserId":3770,"UserName":"CCCC5","UserAge":31,"CreateTime":"2022-09-06 10:44:45"}</div></br> </div>


6、🥙Quick.RabbitMQPlus方法

  • 首先声明Quick.RabbitMQPlus的实例化对象:

    声明发送实例:

    var mqInstance = QuickRabbitMQPlusInstance.Instance();
    

    声明接收实例,并且交换机类型为路由模式:

    var mqInstance = QuickRabbitMQPlusInstance.Instance(true);
    
  • 其次就可以使用使用该实例化对象中的发送和接收方法了,具体说明如下所示:

    方法名称 方法说明 方法参数 备注
    Send 发送消息方法,支持单条消息和多条消息的发送 (data,routeKey) 方法的第一个参数data可以为T或List<T><br />方法的第二个参数为路由名称(当交换机类型为路由模式的时候,该参数起作用,如可以实现使用同一个实体将不同的消息发送到不同的队列中)
    Receive 接收消息(单条消息),该方法有3个重载 重载1:(received)<br />重载2:(received, receivedError)<br />重载3:(received, receivedError, prefetchCount) 方法的第一个参数为回调函数,该回调函数包含2个返回数据(第一个为T,第二个为T对应的字符串),并且该回调函数需要返回bool类型(以便告诉RabbitMQ服务该消息是否处理成功);<br /><br />方法的第二个参数为消费出错的回调函数,该回调函数包括2个返回数据(第一个为错误提示信息,第二个为T对应的字符串)<br />方法的第三个参数为设置RabbitMQ一次最多推送多少条消息给消费者,默认为10
    Receives 接收消息(多条消息),该方法有3个重载 重载1:(received)<br />重载2:(received, receivedError)<br />重载3:(received, receivedError, prefetchCount) 方法的第一个参数为回调函数,该回调函数包含2个返回数据(第一个为List<T>,第二个为List<T>对应的字符串),并且该回调函数需要返回bool类型(以便告诉RabbitMQ服务该消息是否处理成功);<br />方法的第二个参数为消费出错的回调函数,该回调函数包括2个返回数据(第一个为错误提示信息,第二个为List<T>对应的字符串)<br />方法的第三个参数为设置RabbitMQ一次最多推送多少条消息给消费者,默认为10
    ChangeConn 切换连接(切换配置文件中某个连接配置) (connId) 方法参数connId为int类型,即与配置中的ConnId保持一致
    Close 关闭连接 () 注意,如果调用了该方法,又想重新使用实例化对象mqInstance发送或接收消息,需要重新实例化该对象。

    如下所示为接收消息的使用方式:

    //接收队列1的消息
    var retRec1 = await QuickRabbitMQPlusInstance.Instance(true).Receive<TestRabbitMQModel1>(async (data, msg) =>
    {
      await Task.Delay(1000);
    
      Console.ForegroundColor = ConsoleColor.Green;
      Console.WriteLine($"\r\n队列1消息:{msg}");
    
      //返回true代表业务逻辑处理成功,会告知MQ这条消息已经接收成功,会从MQ队列中删除
      //返回false代表业务逻辑处理失败,会告知MQ这条消息没有处理成功,则MQ会继续推送这条消息
      return true;
    }, async (errMsg, msg) =>
    {
      await Task.Delay(3000);
    
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine($"\r\n队列1接收错误:{errMsg}\r\n原始数据:{msg}");
    }, 1);
    if (!retRec1.Item1)
    {
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine($"\r\n队列1接收失败:{retRec1.Item2}");
    }
    

7、🍟Quick.RabbitMQPlus使用说明

Quick.RabbitMQPlus组件的使用方式和Quick.RabbitMQPlus.Furion组件完全一致(包括配置、实体特性和方法等),唯一不同的就是Quick.RabbitMQPlus.Furion需要在启动程序中注册RabbitMQ连接配置对象(builder.Services.AddConfigurableOptions<QuickRabbitMQPlusOptions>();)。

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.10 338 12/30/2022
1.0.9 387 9/30/2022
1.0.8 399 9/28/2022
1.0.7 494 9/27/2022
1.0.6 412 9/21/2022