ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列
接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列
这里继续说下.net core集成使用ActiveMQ。因为代码比较多,所以放到gitee上:https://gitee.com/shanfeng1000/dotnetcore-demo/tree/master/Activemq
感兴趣的可以克隆下来再按照自己的需求修改,这里简单介绍一下使用的Demo(Demo基于.net core3.1的版本,其他版本可能需要自行测试)
生产者(AspNetCore.WebApi.Producer)
在Startup中添加相关服务项:
public void ConfigureServices(IServiceCollection services)
{
var brokerUris = new string[] { "192.168.209.133:61616", "192.168.209.134:61616", "192.168.209.135:61616" };
string userName = "test";
string password = "123456"; #region 日志记录 services.AddLogging(builder =>
{
builder.SetMinimumLevel(LogLevel.Trace);
});
services.AddActiveLogger(options =>
{
options.IsCluster = true;
options.ApplicationName = "WebApi";
options.BrokerUris = brokerUris;
options.Category = "Home";
options.UseQueue = false;
options.Destination = "logger";
options.MinLevel = LogLevel.Warning;
options.InitializeCount = 10;
options.IsPersistent = true;
options.Password = password;
options.UserName = userName;
}); #endregion
#region Active services.AddActiveProducer("active.queue", options =>
{
options.IsCluster = true;
options.BrokerUris = brokerUris;
options.Destination = "active.queue";
options.IsPersistent = true;
options.Transactional = false;
options.Password = password;
options.UserName = userName;
});
services.AddActiveProducer("active.topic", options =>
{
options.IsCluster = true;
options.BrokerUris = brokerUris;
options.Destination = "active.topic";
options.IsPersistent = true;
options.Transactional = false;
options.Password = password;
options.UserName = userName;
}); #endregion ......
}
说明一下,对于日志记录,使用AddActiveLogger拓展方法注入ActiveLoggerProvider,这样当使用.net core的ILogger机制发送消息时,就可以直接将消息发送到ActiveMQ中去了。
如果是普通的发布消息到ActiveMQ,需要先声明生产者的配置,在使用生产者时,只需要注入IActiveProducerFactory接口,然后使用这个接口的创建生产者就可以了,比如Home控制器中的用法:
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
ILogger<HomeController> logger;
IActiveProducerFactory activeProducerFactory;
public HomeController(ILogger<HomeController> logger, IActiveProducerFactory activeProducerFactory)
{
this.logger = logger;
this.activeProducerFactory = activeProducerFactory;
} /// <summary>
/// 日志
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
[HttpGet]
public string Get(string message)
{
logger.LogTrace($"Trace:{message}");
logger.LogDebug($"Debug:{message}");
logger.LogInformation($"Information:{message}");
logger.LogWarning($"Warning:{message}");
logger.LogError($"Error:{message}");
logger.LogCritical($"Critical:{message}"); return "success";
}
/// <summary>
/// 发送消息到队列
/// </summary>
/// <param name="message">消息</param>
/// <returns>success</returns>
[HttpGet("Queue")]
public async Task<object> Queue(string message)
{
message = message ?? "";
var producer = activeProducerFactory.Create("active.queue");
await producer.SendAsync(message); return "success";
}
/// <summary>
/// 发送消息到Topic
/// </summary>
/// <param name="message">消息</param>
/// <returns>success</returns>
[HttpGet("Topic")]
public async Task<object> Topic(string message)
{
message = message ?? "";
var producer = activeProducerFactory.Create("active.topic");
await producer.PublishAsync(message); return "success";
}
}
消费者(AspNetCore.WebApi.Consumer)
消费者注入就简单了,只需要在Startup中声明消费者配置及消息处理过程就可以了:
public void ConfigureServices(IServiceCollection services)
{
var brokerUris = new string[] { "192.168.209.133:61616", "192.168.209.134:61616", "192.168.209.135:61616" };
string userName = "test";
string password = "123456"; #region 日志记录 services.AddActiveConsumer(options =>
{
options.IsCluster = true;
options.BrokerUris = brokerUris;
options.ClientId = "logger";
options.Durable = true;
options.FromQueue = false;
options.Destination = "logger";
options.AutoAcknowledge = true;
options.SubscriberName = "logger";
options.Password = password;
options.UserName = userName;
}).AddListener(result =>
{
Console.WriteLine("Message From Topic logger:" + result.Message);
}); #endregion
#region Active services.AddActiveConsumer(options =>
{
options.IsCluster = true;
options.BrokerUris = brokerUris;
options.Durable = false;
options.Destination = "active.queue";
options.AutoAcknowledge = false;
options.FromQueue = true;
options.Password = password;
options.UserName = userName;
}).AddListener(result =>
{
Console.WriteLine("Message From queue:" + result.Message);
result.Commit();
}); services.AddActiveConsumer(options =>
{
options.IsCluster = true;
options.BrokerUris = brokerUris;
options.Durable = true;
options.Destination = "active.topic";
options.AutoAcknowledge = false;
options.FromQueue = false;
options.Password = password;
options.UserName = userName;
options.ClientId = "active.topic";
options.PrefetchCount = 10;
}).AddListener<MyActiveConsumerListener>();#endregion ......
}
声明消费者使用AddActiveConsumer拓展方法,它返回一个builder,通过它的AddListener方法添加监听消息的处理程序,可以采用一个委托作为,也可以采用一个实现了IActiveConsumerListener接口的类,比这里的MyActiveConsumerListener:
public class MyActiveConsumerListener : IActiveConsumerListener
{
public Task ConsumeAsync(RecieveResult result)
{
Console.WriteLine("Message From topic:" + result.Message);
result.Commit();
return Task.CompletedTask;
}
}
ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列的更多相关文章
- Kafka基础教程(四):.net core集成使用Kafka消息队列
.net core使用Kafka可以像上一篇介绍的封装那样使用(Kafka基础教程(三):C#使用Kafka消息队列),但是我还是觉得再做一层封装比较好,同时还能使用它做一个日志收集的功能. 因为代码 ...
- ActiveMQ基础教程(一):认识ActiveMQ
ActiveMQ是Apache软件基金会所研发开源的消息中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信. 现在的消息队列有不少,RabbitMQ.Kafka.RocketMQ,Z ...
- ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列
接上一篇:ActiveMQ基础教程(二):安装与配置(单机与集群) 安装部署好集群环境:192.168.209.133:61616,192.168.209.134:61616,192.168.209. ...
- ActiveMQ基础教程----简单介绍与基础使用
概述 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多 ...
- Qt零基础教程(四) QWidget详解篇
在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...
- Qt零基础教程(四)QWidget详解(3):QWidget的几何结构
Qt零基础教程(四) QWidget详解(3):QWidget的几何结构 这篇文章里面分析了QWidget中常用的几种几何结构 下图是Qt提供的分析QWidget几何结构的一幅图,在帮助的 Wind ...
- ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 A ...
- ActiveMQ基础教程(二):安装与配置(单机与集群)
因为本文会用到集群介绍,因此准备了三台虚拟机(当然读者也可以使用一个虚拟机,然后使用不同的端口来模拟实现伪集群): 192.168.209.133 test1 192.168.209.134 test ...
- SpringCloud2.0 Ribbon 服务发现 基础教程(四)
1.启动[服务中心]集群,即 Eureka Server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集群,即 Eureka Cli ...
随机推荐
- Virtual functions in derived classes
In C++, once a member function is declared as a virtual function in a base class, it becomes virtual ...
- OC-封装,继承,多态
主要内容概括 标号 主题 内容 一 封装 面向对象三大特性;封装的概念/原因/好处/原则 二 *getter和setter setter / getter方法;注意点 三 自定义代码段 如何自定义代码 ...
- clickhouse输入输出格式 TSKV CSV
TSKVTSKV格式不适合有大量小列的输出.TSKV的效率并不比JSONEachRow差.TSKV数据查询和数据导入.不需要保证列的顺序. 支持忽略某些值,这些列使用默认值,例如0和空白行.复杂类型的 ...
- OSGI与Spring结合开发web工程
简介: 作为一个新的事实上的工业标准,OSGi 已经受到了广泛的关注, 其面向服务(接口)的基本思想和动态模块部署的能力, 是企业级应用长期以来一直追求的目标.Spring 是一个著名的 轻量级 J2 ...
- 记一次单机Nginx调优,效果立竿见影
一.物理环境 1.系统是Centos 8,系统配置 2核4G,8M带宽,一台很轻的应用服务器. 2.站点部署情况.但站点部署两个实例,占用两个端口,使用nginx 负载转发到这两个web站点. 二. ...
- react18 来了,我 get 到...
大家好! 本文主要是关于即将发布的 react 18 的新特性.那么 react18 带来了什么呢? 详情可以关注 github React 18 工作组仓库 1. automatic batchin ...
- 采集 base64 编码的图片
问题 爬虫抓取网页的时候,遇到有的图片是 base64 编码的格式,要怎样下载到本地呢? 示例:base64 编码的 img 标签 <!-- 内容太长省略一部分 --> <img s ...
- [HarekazeCTF2019]baby_rop
看到名字就想到了用rop来做这道题 老样子chescksec和file一下 可以看到是64位的程序开启了nx保护,把程序放到idax64里 可以看到有system和/bin/sh,/bin/sh无法跟 ...
- CF158A Next Round 题解
Content 有 \(n\) 个人参加比赛,第 \(i\) 名在第一轮的分数是 \(a_i\)(保证 \(a_i\geqslant a_{i+1}\))已知下一轮预计能进 \(k\) 人,当然如果有 ...
- java 数据类型:集合接口Collection之队列Queue:PriorityQueue ;Dequeue接口和ArrayDeque实现类:
什么是Queue集合: Queue用于模拟队列这种数据结构,队列通常是"先进先出"(FIFO)的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素. ...