当asp.net core偶遇docker一(模型验证和Rabbitmq 二)
上一篇我们说到构建了一个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 二)的更多相关文章
- 当asp.net core偶遇docker一(模型验证和Rabbitmq 三)
继续上一篇 上一篇,从core方式实现了一个Rabbitmq发送队列消息的接口,我们现在需要在模型验证里面加入验证失败就发送消息的部分 [AttributeUsage(AttributeTargets ...
- 当asp.net core偶遇docker一(模型验证和Rabbitmq 一)
比如我们有一些设计,依赖于某些软件,比如rabbitmq 当管理员功能,反复错误三五次之后,就发送一条消息到队列里去,我们又不希望对原先设计带来侵入式的改变业务 这个时候,我们就可以在模型验证里面加入 ...
- Asp.Net Core 使用Docker进行容器化部署(二)使用Nginx进行反向代理
上一篇介绍了Asp.Net 程序在Docker中的部署,这篇介绍使用Nginx对Docker的实例进行反向代理 一.修改Nginx配置文件 使用winscp链接Liunx服务器,在/ect/nginx ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...
- ASP.NET Core 6.0 基于模型验证的数据验证
1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...
- 当asp.net core偶遇docker二(打造个人docker镜像)
网络上的docker容器总有一些不尽人意的感觉,这个时候,就需要自己diy一个自用的. 比如我们想在163的mysql 5.7内diy一下,结果发现,这个不带vim,我想改造一个自用的mysql镜像, ...
- ASP.NET Core开发-Docker部署运行
ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...
- 基于Microsoft Azure、ASP.NET Core和Docker的博客系统
欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...
- .NET Core微服务之ASP.NET Core on Docker
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ...
随机推荐
- Django---进阶15
目录 文章详情页 文章点赞点踩 文章评论 文章详情页 # url设计 /username/article/1 # 先验证url是否会被其他url顶替 # 文章详情页和个人站点基本一致 所以用模版继承 ...
- postman-5-授权
授权 Inherit auth from parent 假设现在将一个文件夹添加到集合中.在授权选项卡下,默认授权类型就被设置为“从父继承授权”“从父继承授权”设置表示默认情况下此文件夹中的每个请求都 ...
- [设计模式]面向对象五大设计原则:SOLID
SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...
- 实现new关键字
一.new做了什么 1.创建了一个全新的对象. 2.这个对象会被执行[[Prototype]](也就是__proto__)链接. 3.生成的新对象会绑定到函数调用的this. 4.通过new创建的每个 ...
- C++左值引用与右值引用
本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/references-cpp?view=vs-2019 引用,类似于指针,用于存储一个位于内存某处的对象的 ...
- Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...
- Python之网络编程 Socket编程
本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实 ...
- bzoj2296【POJ Challenge】随机种子*
bzoj2296[POJ Challenge]随机种子 题意: 求一个≤10^16的数,使这个数包含123456789且为x的倍数.x≤1000000. 题解: 16-6刚好等于10.因此我们可以直接 ...
- Spring用到了那些注解?
一:@Autowired(按类型注入)1.1通过 @Autowired的使用来消除 set ,get方法.@Autowiredprivate Dao dao;这样就可以删除set ,get方法和spr ...
- 仔细想想SpringAOP也不难嘛,面试没有必要慌
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! LOGO SpringAOP 一.什么是AOP AOP(As ...