之前有写到一篇介绍EasyNetQ的博文(C# .net 使用rabbitmq消息队列——EasyNetQ插件介绍),所以本文从.net core的角度去继承使用EasyNetQ,而用法类似于之前集成使用rabbitmq的博文:.net core使用rabbitmq消息队列 (二)

  国际惯例,先上代码,但是代码比较多,所有又放gitee了:https://gitee.com/shanfeng1000/dotnetcore-demo/tree/master/EasyNetQ

  

  消息发布(AspNetCore.WebApi.Producer)

  Demo中这个项目是消息的发布程序,在Startup中添加服务:    

  

    public void ConfigureServices(IServiceCollection services)
{
var connectionString = "host=192.168.209.133;virtualHost=/;username=admin;password=123456;timeout=60";
string[] hosts = new string[] { "192.168.209.133", "192.168.209.134", "192.168.209.135" };
ushort port = 5672;
string userName = "admin";
string password = "123456";
string virtualHost = "/";
var arguments = new Dictionary<string, object>() { { "x-queue-type", "classic" } }; #region 订阅发布 services.AddEasyNetQProducer("Publish", options =>
{
//options.ConnectionString = connectionString;
options.Hosts = hosts;
options.Port = port;
options.Password = password;
options.UserName = userName;
options.VirtualHost = virtualHost; options.PersistentMessages = true;
options.Priority = 1;
}); #endregion
#region 请求响应 services.AddEasyNetQProducer("Request", options =>
{
//options.ConnectionString = connectionString;
options.Hosts = hosts;
options.Port = port;
options.Password = password;
options.UserName = userName;
options.VirtualHost = virtualHost; options.PersistentMessages = true;
options.Priority = 3;
}); #endregion
#region 发送接收 services.AddEasyNetQProducer("Send", options =>
{
//options.ConnectionString = connectionString;
options.Hosts = hosts;
options.Port = port;
options.Password = password;
options.UserName = userName;
options.VirtualHost = virtualHost; options.Priority = 4;
options.Queue = "send-recieve";
}); #endregion
......
}

ConfigureServices

  添加相关服务使用AddEasyNetQProducer方法,可以指定一个名称,在创建生产者时可以提供指定的名称。熟悉EasyNetQ的朋友应该知道它提供三种消息模式:Publish/Subscribe, Request/Response和 Send/Receive,正是上面的三种申明方式。

  使用时,需要先注入IBusClientFactory对象,使用它的Create方法创建生产者对象,然后使用这个对象的方法操作消息(Publish方法、Request方法、Send方法分别对应上面的三种模式)。

  另外,EasyNetQ的消息都是一些自定的实体类,因此我们发送消息需要自定创建实体类,比如发布订阅消息时创建的实体类Subscriber:  

    public class Subscriber
{
public string Message { get; set; }
}

  使用时:  

    /// <summary>
/// 发布订阅模式
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
[HttpGet("Publish")]
public string Publish(string message)
{
message = message ?? "";
var bus = busFactory.Create("Publish");
bus.Publish(new Subscriber() { Message = message }); return "success";
}

  

  消息消费(AspNetCore.WebApi.Consumer)

  首先,在Startup中添加服务:  

  

    public void ConfigureServices(IServiceCollection services)
{
var connectionString = "host=192.168.209.133;virtualHost=/;username=admin;password=123456;timeout=60";
string[] hosts = new string[] { "192.168.209.133", "192.168.209.134", "192.168.209.135" };
ushort port = 5672;
string userName = "admin";
string password = "123456";
string virtualHost = "/";
var arguments = new Dictionary<string, object>() { { "x-queue-type", "classic" } }; #region 订阅发布 services.AddEasyNetQConsumer(options =>
{
//options.ConnectionString = connectionString;
options.Hosts = hosts;
options.Port = port;
options.Password = password;
options.UserName = userName;
options.VirtualHost = virtualHost; options.AutoDelete = true;
options.Durable = true;
options.PrefetchCount = 1;
options.Priority = 2;
})
.AddSubscriber("PubSub1",typeof(EasyNetQSubscriber))
.AddSubscriber<Subscriber>("PubSub2", r =>
{
Console.WriteLine("PubSub:" + r.Message);
}); #endregion
#region 请求响应 services.AddEasyNetQConsumer(options =>
{
//options.ConnectionString = connectionString;
options.Hosts = hosts;
options.Port = port;
options.Password = password;
options.UserName = userName;
options.VirtualHost = virtualHost; options.Durable = true;
options.PrefetchCount = 2;
})
.AddResponder(typeof(EasyNetQResponder))
.AddResponder<Requester, Responder>(request =>
{
Console.WriteLine("Rpc:" + request.Data);
return new Responder() { Result = "Rpc:" + request.Data };
}); #endregion
#region 发送接收 services.AddEasyNetQConsumer(options =>
{
//options.ConnectionString = connectionString;
options.Hosts = hosts;
options.Port = port;
options.Password = password;
options.UserName = userName;
options.VirtualHost = virtualHost; options.Priority = 5;
options.PrefetchCount = 5;
options.Exclusive = false;
options.Arguments = arguments;
options.Queue = "send-recieve";
})
.AddReceiver(typeof(EasyNetQReceiver<Reciever1>))
.AddReceiver(typeof(EasyNetQReceiver<Reciever2>));
//.AddReceiver<Reciever1>(r =>
//{
// Console.WriteLine("Reciever1:" + r.Message);
//})
//.AddReceiver<Reciever2>(r =>
//{
// Console.WriteLine("Reciever2:" + r.Message);
//}); #endregion ......
}

ConfigureServices

  这里先使用AddEasyNetQConsumer方法获得一个消费者建造者,然后使用它的AddSubscriber方法、AddResponder方法、AddReceiver方法添加消费消息的处理过程,当然这三个方法分别也是对应上面的三种模式。

  另外,这三个方法添加的消息处理程序可以使用Lambda表达式实现,也可以通过响应的接口实现,比如AddSubscriber方法添加的处理程序可通过实现了IEasyNetQSubscriber<T>接口的类来替代,比如Demo中的EasyNetQSubscriber:  

    public class EasyNetQSubscriber : IEasyNetQSubscriber<Subscriber>
{
public void Subscribe(Subscriber message)
{
Console.WriteLine("EasyNetQSubscriber:" + message.Message);
}
}

.net core集成使用EasyNetQ来使用rabbitmq的更多相关文章

  1. .net core集成使用consul

    快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...

  2. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  3. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  4. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  5. [Abp 源码分析]十七、ASP.NET Core 集成

    0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ...

  6. Net Core集成Exceptionless分布式日志功能以及全局异常过滤

    Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...

  7. Asp.Net Core 集成 Hangfire 配置使用 Redis 存储

    Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...

  8. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

  9. asp.net core集成CAP(分布式事务总线)

    一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...

随机推荐

  1. Linux学习 - 网络命令

    一.write 1 功能 给指定在线用户发信息,以Ctrl + D保存结束 2 语法 write  <用户名>  [信息] 二.wall(write all) 1 功能 给所有在线用户发送 ...

  2. 初始化Linux数据盘、磁盘分区、挂载磁盘(fdisk)

    1.操作场景 2.前提条件 3.划分分区并挂载磁盘 4.设置开机自动挂载磁盘分区 1.操作场景 本文以云服务器的操作系统为"CentOS 7.4 64位"为例,采用fdisk分区工 ...

  3. 编译安装redis之快速增加redis节点

    #: 下载安装包 [root@localhost ~]# wget http://download.redis.io/releases/redis-4.0.14.tar.gz #:解压 [root@l ...

  4. shell获取目录下(包括子目录)所有文件名、路径、文件大小

    一例shell脚本:取得目录下(包括子目录)所有文件名.路径与文件大小. 代码,shell脚本: lsdir.sh #!/bin/bash # #site: www.jquerycn.cn funct ...

  5. Jenkins动态选择分支/tag

    目录 一.简介 二.配置 三.配置tag 四.其它方法 五.List Git Branches插件 一.简介 一般选择分支构建,Git Parameter插件即可.这里是应用pipline的同时,可以 ...

  6. 『学了就忘』Linux系统管理 — 81、进程管理介绍

    目录 1.进程与线程的概念 2.什么是进程管理 3.进程管理的作用 4.Linux进程的几种状态 5.进程与线程的关系 (1)线程与进程的关系 (2)总结 1.进程与线程的概念 来源百度百科: 进程( ...

  7. python内置模块(一)

    re模块 基本操作方法 1.使用findall方法可以根据正则表达式筛选所有符合的字符.基本句式为: re.findall('正则表达式',待匹配的字符) 结果为一个列表,没有结果为空列表. 2.使用 ...

  8. JavaWeb的三大作用域

    三大作用域描述 名称 类型 描述 request HttpServletRequest 将数据放在请求作用域中,在一次请求中实现数据的共享,比如请求转发 session HttpSession 将数据 ...

  9. 『学了就忘』Linux系统管理 — 86、查看系统资源相关命令

    目录 1.vmstat命令 2.dmesg命令 3.free命令 4.查看CPU信息 5.查看本机登陆用户信息 (1)w命令 (2)who命令 6.uptime命令 7.查看系统与内核相关信息 1.v ...

  10. 在eclipse打开jsp文件变成文本的解决:

    在eclipse打开jsp文件变成文本的解决: ------原因:可能是不小心删除某些组件等等一些操作 1,考虑一下是否还有插件jsp 编辑器组件 选择内部编辑器[在下面选择 JSP Editor]- ...