Uwl.Admin.Core中使用RabbitMQ消息队列:

本文负责讲解RabbitMQ的使用

Uwl.Admin.Core使用的技术有:

  *、Async和Await 异步编程

  *、Repository + Service 仓储模式编程;仓储模式支持工作单元

  *、Swagger 前后端文档说明,基于RESTful风格编写接口

  *、Cors 简单的跨域解决方案

  *、JWT自定义策略授权权限验证

  *、依赖注入选择的是官方自带的DI注入,没有使用第三方框架,ORM使用EF Core,数据库使用的是Sql server,(后期会扩展MySql版本);

  *、AutoMapper 自动对象映射、

  *、Linq To Sql \ lambda表达式树查询;(表达式树查询是个人扩展的,表达式树的使用方法请参考Uwl.Data.Server.MenuServer的多条件查询)

  *、登录认证方式使用JWT认证方式,后台接口使用SwaggerUI展示,角色权限使用  自定义权限处理器PermissionHandler 继承与微软官方 IAuthorizationRequirement;

  *、Excel导入导出使用的是Epplus第三方框架,导入导出只需要配置Attribute特性就好,不需要在自己写列名;导出只支持List导出,暂时不支持Datatable;(Excel使用方法请参考UserController控制器)

  *、Rabbit MQ消息队列(目前暂无业务使用场景后期准备用来记录日志)

  *、Redis 轻量级分布式缓存;(Redis使用方法请参考Uwl.Data.Server.MenuServer类)

  *、QuartzNet第三方任务框架;(使用方法请参考类库Uwl.ScheduledTask.Job.TestJobOne类)

  *、IdentityServer4授权模式已开发完成,未发布演示服务器代码在github;(Identityserver4Auth分支)

RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。

RabbitMQ安装

请参考我的第一篇博客:

安装完成之后访问Web控制台

http://服务器ip:15672/ 注意配置防火墙,默认用户名密码都是guest,若新建用户一定要记得配置权限。guest仅限localhost访问,外网无法使用此账号!

.NET Core 使用RabbitMQ

通过nuget安装:https://www.nuget.org/packages/RabbitMQ.Client/

定义生产者.

本文的代码生产者是基础的消息队列生产者,源代码请看我的开源项目 UWl.Admin.Core

public class RabbitServer: IRabbitMQ
{
private IConnection connection;
private ConnectionFactory connectionFactory;
public RabbitServer()
{
try
{
connectionFactory = new ConnectionFactory()
{
UserName = Appsettings.app(new string[] { "RabbitMQConfig", "UserName" }),
Password = Appsettings.app(new string[] { "RabbitMQConfig", "Password" }),
HostName = Appsettings.app(new string[] { "RabbitMQConfig", "HostName" }),
AutomaticRecoveryEnabled= Convert.ToBoolean(Appsettings.app(new string[] { "RabbitMQConfig", "AutomaticRecoveryEnabled" })),
TopologyRecoveryEnabled= Convert.ToBoolean(Appsettings.app(new string[] { "RabbitMQConfig", "TopologyRecoveryEnabled" })),
};
}
catch (Exception)
{
throw;
}
} public IConnection GetConnection()
{
return this.connectionFactory.CreateConnection();
}
/// <summary>
/// RabbitMQ指定队列名称模式发送消息
/// </summary>
/// <param name="queuename">队列名字</param>
/// <param name="obj">传输数据</param>
public void SendData(string queuename, object obj)
{
connection = GetConnection();
if (obj == null)
return;
if (connection == null)
return;
if (queuename.IsNullOrEmpty())
return;
using (connection)
{
using (var channel= connection.CreateModel())
{
//声明一个队列 //队列模式 一共有四种
channel.QueueDeclare(queuename, false, false, false, null);
//第一个参数:预计大小,第二个参数每次读取几个,第三个参数是否本地
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
//交付模式
var prop = channel.CreateBasicProperties();
// 非持久性(1)或持久性(2)。
prop.DeliveryMode = 2;
//将对象转化为json字符串
var json = JsonConvert.SerializeObject(obj);
//将字符串转换为二进制
var bytes= Encoding.UTF8.GetBytes(json);
//开始传送
channel.BasicPublish("", queuename, prop,bytes);
}
}
}
}
定义消费者.

消费者我是使用.Net Core控制台程序来写的源代码放到了百度网盘请自行下载 RebbitMQDemo 链接: https://pan.baidu.com/s/1n9CaSiAuB9t63Fh_YIU78A 提取码: 3939

//创建连接工厂
ConnectionFactory factory = new ConnectionFactory
{
UserName = "wzw",
Password = "wzw",
HostName = "localhost"
};
//创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel(); //接收到的消息处理事件
EventingBasicConsumer Recipient = new EventingBasicConsumer(channel);
Recipient.Received += (ch, ea) =>
{
var RecipientMsg = Encoding.UTF8.GetString(ea.Body);
Console.WriteLine($"后台处理方法收到消息:{RecipientMsg}");
//确认该消息已被处理
channel.BasicAck(ea.DeliveryTag, false);
Console.WriteLine($"消息已经处理【{ea.DeliveryTag}】");
};
channel.BasicConsume("hello", false, Recipient);
Console.WriteLine("后台处理方法已启动");
Console.ReadKey();
channel.Dispose();
connection.Close();

RabbitMQ消费失败的处理

RabbitMQ采用消息应答机制,即消费者收到一个消息之后,需要发送一个应答,然后RabbitMQ才会将这个消息从队列中删除,如果消费者在消费过程中出现异常,断开连接切没有发送应答,那么RabbitMQ会将这个消息重新投递。

使用RabbitMQ的Exchange

前面我们可以看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生。实际的情况是,生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃)

AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。

Uwl.Admin.Core开源框架(三) 使用RabbitMQ的更多相关文章

  1. Uwl.Admin.Core开源框架(二) 使用QuartzNet

    Uwl.Admin.Core中使用QuartzNet定时任务模块: 本文负责讲解RabbitMQ的使用 Uwl.Admin.Core使用的技术有: *.Async和Await 异步编程 *.Repos ...

  2. Magicodes.Admin.Core开源框架总体介绍

    框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NE ...

  3. .net Core开源框架NetModular记录

    NetModular 源码: https://github.com/iamoldli/NetModular 文档: https://nm.iamoldli.com/docs/guide/

  4. 使用微服务Blog.Core开源框架的一些坑

    1.使用SqlSuger组件时同一API无法自动切库 1.1 在生成Model时在类上加上特性 1.2 一个接口如果使用了多个数据库实例,会出现库找不到,需要使用ChangeDataBase切库 2. ...

  5. Uwl.Admin开源框架(二)

    Uwl.Admin开源框架基于QuartzNet定时任务模块的实现 Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:ht ...

  6. Uwl.Admin开源框架(一)

    1.前言 作为一个忠实的软粉,一直期待微软出跨平台,一直在等待.Net Core,因为刚毕业对于.Net的很多东西不是很熟知,就开始了.Net Core的摸索,一路上坎坎坷坷,对于新技术一直很期待,就 ...

  7. c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具

    c#实例化继承类,必须对被继承类的程序集做引用   0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...

  8. .NET Core开源Quartz.Net作业调度框架实战演练

    一.需求背景 人生苦短,我用.NET Core!作为一枚后端.NET开发人员,项目实践常遇到定时Job任务的工作,在Windows平台最容易想到的的思路Windows Service服务应用程序,而在 ...

  9. .net core 基于Dapper 的分库分表开源框架(core-data)

    一.前言 感觉很久没写文章了,最近也比较忙,写的相对比较少,抽空分享基于Dapper 的分库分表开源框架core-data的强大功能,更好的提高开发过程中的效率: 在数据库的数据日积月累的积累下,业务 ...

随机推荐

  1. Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】

    全部章节   >>>> 本章目录 8.1 Session机制 8.1.1 Session 简介 8.1.2 创建 HttpSession 实例 8.1.3 HttpSesiso ...

  2. WinForm应用程序的开机自启、记住密码,自动登录的实现

    一.思路: 1.开机自启,自然是需要用到注册表,我们需要把程序添加到电脑的注册表中去 2.记住密码,自动登录,开机自启,在页面的呈现我们都使用复选框按钮来呈现 3.数据持久化,不能是数据库,可以是sq ...

  3. LDAP客户端安装

    安装环境: 10.43.159.7 客户端 使用ldap客户端验证登陆: 用户为10.43.159.9服务端上面创建的ldap:zdh1234 1.安装LDAP client认证需要的pam包 yum ...

  4. 【计理05组01号】R 语言基础入门

    R 语言基本数据结构 首先让我们先进入 R 环境下: sudo R 赋值 R 中可以用 = 或者 <- 来进行赋值 ,<- 的快捷键是 alt + - . > a <- c(2 ...

  5. JS 数组的基本使用和案例

    知识点汇总: 数组:就是一组数据的集合,存储在单个变量的方式 自变量创建数组 var 数组名字 = ['a','b'] // []里面的是数据的元素,可为任意字符类型 利用new创建数组 var 数组 ...

  6. 树形DP总结基础

    概念 应用 例题 最大独立子集 没有上司的晚会 题目描述 分析 树的重心 题目描述 分析 树的直径 概念 题目描述 分析 概念 给定一棵有N个节点的树(通常是无根树,也就是有N-1条无向边),我们可以 ...

  7. Linux查看进程启动时间和运行多长时间

    Linux 查看进程启动时间和运行多长时间 启动时间 ps -eo lstart 运行多长时间 ps -eo etime -bash-4.1$ ps -eo pid,lstart,etime | gr ...

  8. vim安装使用pathogen

    pathogen是什么? pathogen一般作为vim新手的第一个插件,用来统一管理vim插件包, (官方解释)非常容易的管理你的 'runtimepath' ,在实际项目中,vim-pathoge ...

  9. SpringBoot整合Elasticsearch+ik分词器+kibana

    话不多说直接开整 首先是版本对应,SpringBoot和ES之间的版本必须要按照官方给的对照表进行安装,最新版本对照表如下: (官网链接:https://docs.spring.io/spring-d ...

  10. 【C语言】将文本中汉字读入字符数组输出乱码

    输出中文字符乱码 今天从文件中将中文读入字符数组后输出发现其中文变成了乱码,,令人头大. 解决办法 将文本编码格式改成ANSI即可. 打开记事本->文件->另存为->更改编码格式-& ...