上一篇我们说到构建了一个Rabbitmq容器

现在我们说说如何在一个悄悄传输消息到队列

我们现在设计一个Rabbitmq发送消息部分的模块

先设计一个远程发送的接口

    public interface IRemoteSend
{
void Send(object entity);
}

写一个Rabbitmq配置实体

    public class RabbitmqConfigura
{
public string Host { get; set; }
public int Port { get; set; }
public string User { get; set; }
public string Password { get; set; }
public string VirtualHost { get; set; }
}

写一个实现IRemoteSend的RabbitmqRemoteSend

    public class RabbitmqRemoteSend : IRemoteSend
{
private RabbitmqConfigura Configura { get; }
public RabbitmqRemoteSend(IOptions<RabbitmqConfigura> options)
{
Configura = options.Value;
} public void Send(object entity)
{
throw new NotImplementedException();
}
}

我们再实现以下Send方法

    public class RabbitmqRemoteSend : IRemoteSend
{
public int DelaySend { get; set; }
private RabbitmqConfigura Configura { get; }
public RabbitmqRemoteSend(IOptions<RabbitmqConfigura> options)
{
Configura = options.Value;
} public void Send(object entity)
{
var factory = new ConnectionFactory
{
HostName = Configura.Host,
Port = Configura.Port,
UserName = Configura.User,
Password = Configura.Password,
VirtualHost = Configura.VirtualHost, AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds()
}; using (var connection = factory.CreateConnection())
{
var model = connection.CreateModel(); var type_name = entity.GetType();
var ExchangeName = type_name + ".exchange";
var RouteKeyName = type_name + ".input";
var QueueName = type_name + ".input"; model.ConfirmSelect();
model.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
model.QueueDeclare(QueueName, false, false, false);
model.QueueBind(QueueName, ExchangeName, RouteKeyName); var args = new Dictionary<string, object>();
args.Add("x-message-ttl", DelaySend);
args.Add("x-dead-letter-exchange", ExchangeName);
args.Add("x-dead-letter-routing-key", QueueName);
model.QueueDeclare(QueueName + ".delay", false, false, false, args); var bytes = new byte[];
var props = model.CreateBasicProperties(); props.ContentType = "text/plain";
props.DeliveryMode = ;
model.BasicPublish(ExchangeName, RouteKeyName, props, bytes);
model.WaitForConfirms();
}
}
}

我们需要定义一个序列化的接口做数据编码

    public interface IFormattor
{
byte[] SerializeObject(object entity);
}

写一个默认实现

    public class JsonFormattor : IFormattor
{
public byte[] SerializeObject(object entity)
{
var jsonString = JsonConvert.SerializeObject(entity);
return Encoding.UTF8.GetBytes(jsonString);
}
}

再修改以下RabbitmqRemoteSend

public class RabbitmqRemoteSend : IRemoteSend
{
public int DelaySend { get; set; }
private RabbitmqConfigura Configura { get; }
private IFormattor Formattor { get; }
public RabbitmqRemoteSend(IOptions<RabbitmqConfigura> options, IFormattor formattor)
{
Configura = options.Value;
Formattor = formattor;
} public void Send<TEntity>(TEntity entity) where TEntity : class
{
var factory = new ConnectionFactory
{
HostName = Configura.Host,
Port = Configura.Port,
UserName = Configura.User,
Password = Configura.Password,
VirtualHost = Configura.VirtualHost, AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds()
}; using (var connection = factory.CreateConnection())
{
var model = connection.CreateModel(); var type_name = entity.GetType().Name;
var ExchangeName = type_name + ".exchange";
var RouteKeyName = type_name + ".input";
var QueueName = type_name + ".input"; model.ConfirmSelect();
model.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
model.QueueDeclare(QueueName, false, false, false);
model.QueueBind(QueueName, ExchangeName, RouteKeyName); var args = new Dictionary<string, object>();
args.Add("x-message-ttl", DelaySend);
args.Add("x-dead-letter-exchange", ExchangeName);
args.Add("x-dead-letter-routing-key", QueueName);
model.QueueDeclare(QueueName + ".delay", false, false, false, args); var bytes = Formattor.SerializeObject(entity);
var props = model.CreateBasicProperties(); props.ContentType = "text/plain";
props.DeliveryMode = ;
model.BasicPublish(ExchangeName, RouteKeyName, props, bytes);
model.WaitForConfirms();
}
}
}

我们加入asp.net core测试一下

在ConfigureServices内增加代码

            #region Rabbitmq
services.Configure<RabbitmqConfigura>(p =>
{
p.User = "admin";
p.Password = "";
p.Host = "127.0.0.1";
});
services.AddScoped<IFormattor, JsonFormattor>();
services.AddScoped<IRemoteSend, RabbitmqRemoteSend>();
#endregion

在Configure增加代码

            var scope = app.ApplicationServices.CreateScope();
var remoteSend = scope.ServiceProvider.GetRequiredService<IRemoteSend>();
remoteSend.Send(new User()
{
Name = "hello",
Account = "account"
});

这段代码是完全用来测试的

User实体对象

    public class User
{
public string Name { get; set; }
public string Account { get; set; }
}

我们在看看Rabbitmq内

看看内容

当asp.net core偶遇docker一(模型验证和Rabbitmq 二)的更多相关文章

  1. 当asp.net core偶遇docker一(模型验证和Rabbitmq 三)

    继续上一篇 上一篇,从core方式实现了一个Rabbitmq发送队列消息的接口,我们现在需要在模型验证里面加入验证失败就发送消息的部分 [AttributeUsage(AttributeTargets ...

  2. 当asp.net core偶遇docker一(模型验证和Rabbitmq 一)

    比如我们有一些设计,依赖于某些软件,比如rabbitmq 当管理员功能,反复错误三五次之后,就发送一条消息到队列里去,我们又不希望对原先设计带来侵入式的改变业务 这个时候,我们就可以在模型验证里面加入 ...

  3. Asp.Net Core 使用Docker进行容器化部署(二)使用Nginx进行反向代理

    上一篇介绍了Asp.Net 程序在Docker中的部署,这篇介绍使用Nginx对Docker的实例进行反向代理 一.修改Nginx配置文件 使用winscp链接Liunx服务器,在/ect/nginx ...

  4. ASP.NET Core - 实现自定义WebApi模型验证

    Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...

  5. ASP.NET Core 6.0 基于模型验证的数据验证

    1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...

  6. 当asp.net core偶遇docker二(打造个人docker镜像)

    网络上的docker容器总有一些不尽人意的感觉,这个时候,就需要自己diy一个自用的. 比如我们想在163的mysql 5.7内diy一下,结果发现,这个不带vim,我想改造一个自用的mysql镜像, ...

  7. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  8. 基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统   2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...

  9. .NET Core微服务之ASP.NET Core on Docker

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ...

随机推荐

  1. Python语法的使用和简介

    前言 Python的语法和其它编程语言的语法有所不同,编写Paython程序之前需要对语法有所了解,才能编写规范的Python程序. 输入输出 print() # 打印显示input() # 输入内容 ...

  2. Django初级之django简介

    1.Django简介 Django是Python语言中的一个web框架,Python语言中主流的web框架有Django.Tornado.Flask 等多种.Django相较与其它WEB框架,其优势为 ...

  3. day31 反射,内置方法,元类

    目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...

  4. JS基础知识点(二)

    == 与 === 对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,就会进行如下判断流程: 1.首先会判断两者类型是否相同,相同则会进行严格相等比较=== 2.判断是否在对比null和 ...

  5. setTimeout还有第三个参数

    今天才发现setTimeout还有第三个参数. for (var i = 0; i< 10; i++){ setTimeout((i) => { console.log(i); }, 10 ...

  6. sass-loader安装+Failed to resolve loader: sass-loader You may need to install it.解决方法

    方式一: 通过 cnpm 安装node-sass cnpm install node-sass --save 方式二: 通过npm 安装 1.安装sass-loader npm install sas ...

  7. CRM开发系列

    CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环:新客户的 ...

  8. .NET 开源项目 StreamJsonRpc 介绍[下篇]

    阅读本文大概需要 9 分钟. 大家好,这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇.上篇介绍了一些预备知识,包括 JSON-RPC 协议介绍,StreamJsonRpc 是一个 ...

  9. 什么?你正在学web自动化测试?那这些Selenium的基本操作你了解过吗?

    在自动化测试中,我们都知道是通过定位元素来实现的,那么有时候我们定位元素定位不到是为什么呢? 1.页面出现了iframe 2.出现了新的窗口,没有实现句柄的切换 3.三种等待方式,没有选择其中之一来使 ...

  10. Ethical Hacking - GAINING ACCESS(17)

    CLIENT SIDE ATTACKS - Backdooring exe' s Download an executable file first. VEIL - FRAMEWORK A backd ...