上一篇我们说到构建了一个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. PHP一维数组快速去重、去零

    1.一维数组去重: /** * 一维数组去重,返回格式为索引数组 * @param array $data 待去重的数组 * @return array */ public static functi ...

  2. Java实现上传文件到指定服务器指定目录(ChannelSftp实现文件上传下载)

    package com.tianyang.task.utils; import java.io.File;import java.io.FileInputStream;import java.io.I ...

  3. Spring @Value注解使用${}进行注入(转)

    原文:http://my.oschina.net/js99st/blog/632104 spring3中新增的@value注解 http://bijian1013.iteye.com/blog/202 ...

  4. VirtualBox安装centos8

    原文链接:https://www.wjcms.net/archives/vagrantbox安装centos8 VirtualBox安装centos8 在线安装(不推荐) 打开git软件,直接运行命令 ...

  5. Python函数06/装饰器

    Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...

  6. Python Ethical Hacking - The Lab and Needed Software

    The Lab and Needed Software Attacker Machine - Kali Linux https://www.kali.org/ 1. Install the softw ...

  7. DEBUG ArrayList

    1,ArrayList面试必问 说说ArrayList和LinkedList的区别? ArrayList基于数组实现,LinkedList基于链表实现,不同的数据结构决定了ArrayList查询效率比 ...

  8. Cooperative Groups

    Cooperative Groups 目录 Cooperative Groups 简介 块内组 thread_block tiled_partition Thread Block Tiles Coal ...

  9. react实战 : react 与 svg

    有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...

  10. 你闺女也能看懂的插画版 Kubernetes 指南

    Matt Butcher是Deis的平台架构师,热爱哲学,咖啡和精雕细琢的代码.有一天女儿走进书房问他什么是Kubernetes,于是就有了这本插画版的Kubernetes指南,讲述了勇敢的Phipp ...