.NET 分布式事件总线 Jaina v1.0.0 发布
Jaina
.NET 事件总线,简化项目、类库、线程、服务等之间的通信,代码更少,质量更好。
安装
Install-Package Jaina
dotnet add package Jaina
快速入门
我们在主页上有不少例子,这是让您入门的第一个:
- 定义事件订阅者
ToDoEventSubscriber
:
// 实现 IEventSubscriber 接口 public class ToDoEventSubscriber : IEventSubscriber { private readonly ILogger<ToDoEventSubscriber> _logger; public ToDoEventSubscriber(ILogger<ToDoEventSubscriber> logger) { _logger = logger; } // 标记 [EventSubscribe(事件 Id)] 特性 [EventSubscribe("ToDo:Create")] public async Task CreateToDo(EventHandlerExecutingContext context) { var todo = context.Source; _logger.LogInformation("创建一个 ToDo:{Name}", todo.Payload); await Task.CompletedTask; } }
- 创建控制器
ToDoController
,依赖注入IEventPublisher
服务:
[Route("api/[controller]/[action]")] [ApiController] public class ToDoController : ControllerBase { // 依赖注入事件发布者 IEventPublisher private readonly IEventPublisher _eventPublisher; public ToDoController(IEventPublisher eventPublisher) { _eventPublisher = eventPublisher; } // 发布 ToDo:Create 消息 [HttpPost] public async Task CreateDoTo(string name) { await _eventPublisher.PublishAsync(new ChannelEventSource("ToDo:Create", name)); } }
- 在
Startup.cs
注册EventBus
服务:
public class Startup { public void ConfigureServices(IServiceCollection services) { // 注册 EventBus 服务 services.AddEventBus(buidler => { // 注册 ToDo 事件订阅者 buidler.AddSubscriber<ToDoEventSubscriber>(); }); // .... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // .... } }
- 运行项目:
info: Jaina.Samples.ToDoEventSubscriber[0] 创建一个 ToDo:Jaina
高级教程
1. 自定义事件源 IEventSource
Jaina 使用 IEventSource
作为消息载体,任何实现该接口的类都可以充当消息载体。
如需自定义,只需实现 IEventSource
接口即可:
public class ToDoEventSource : IEventSource { // 自定义属性 public string ToDoName { get; } /// <summary> /// 事件 Id /// </summary> public string EventId { get; } /// <summary> /// 事件承载(携带)数据 /// </summary> public object Payload { get; } /// <summary> /// 取消任务 Token /// </summary> /// <remarks>用于取消本次消息处理</remarks> public CancellationToken CancellationToken { get; } /// <summary> /// 事件创建时间 /// </summary> public DateTime CreatedTime { get; } = DateTime.UtcNow; }
使用:
await _eventPublisher.PublishAsync(new ToDoEventSource { EventId = "ToDo:Create", ToDoName = "我的 ToDo Name" });
2. 自定义事件源存储器 IEventSourceStorer
Jaina 默认采用 Channel
作为事件源 IEventSource
存储器,开发者可以使用任何消息队列组件进行替换,如 Kafka、RabbitMQ、ActiveMQ
等,也可以使用部分数据库 Redis、SQL Server、MySql
实现。
如需自定义,只需实现 IEventSourceStorer
接口即可:
public class RedisEventSourceStorer : IEventSourceStorer { private readonly IRedisClient _redisClient; public RedisEventSourceStorer(IRedisClient redisClient) { _redisClient = redisClient; } // 往 Redis 中写入一条 public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken) { await _redisClient.WriteAsync(...., cancellationToken); } // 从 Redis 中读取一条 public async ValueTask<IEventSource> ReadAsync(CancellationToken cancellationToken) { return await _redisClient.ReadAsync(...., cancellationToken); } }
最后,在注册 EventBus
服务中替换默认 IEventSourceStorer
:
services.AddEventBus(buidler => { // 替换事件源存储器 buidler.ReplaceStorer<RedisEventSourceStorer>(); });
3. 自定义事件发布者 IEventPublisher
Jaina 默认内置基于 Channel
的事件发布者 ChannelEventPublisher
。
如需自定义,只需实现 IEventPublisher
接口即可:
public class ToDoEventPublisher : IEventPublisher { private readonly IEventSourceStorer _eventSourceStorer; public ChannelEventPublisher(IEventSourceStorer eventSourceStorer) { _eventSourceStorer = eventSourceStorer; } public async Task PublishAsync(IEventSource eventSource) { await _eventSourceStorer.WriteAsync(eventSource, eventSource.CancellationToken); } }
最后,在注册 EventBus
服务中替换默认 IEventPublisher
:
services.AddEventBus(buidler => { // 替换事件源存储器 buidler.ReplacePublisher<ToDoEventPublisher>(); });
4. 添加事件执行监视器 IEventHandlerMonitor
Jaina 提供了 IEventHandlerMonitor
监视器接口,实现该接口可以监视所有订阅事件,包括 执行之前、执行之后,执行异常,共享上下文数据
。
如添加 ToDoEventHandlerMonitor
:
public class ToDoEventHandlerMonitor : IEventHandlerMonitor { private readonly ILogger<ToDoEventHandlerMonitor> _logger; public ToDoEventHandlerMonitor(ILogger<ToDoEventHandlerMonitor> logger) { _logger = logger; } public Task OnExecutingAsync(EventHandlerExecutingContext context) { _logger.LogInformation("执行之前:{EventId}", context.Source.EventId); return Task.CompletedTask; } public Task OnExecutedAsync(EventHandlerExecutedContext context) { _logger.LogInformation("执行之后:{EventId}", context.Source.EventId); if (context.Exception != null) { _logger.LogError(context.Exception, "执行出错啦:{EventId}", context.Source.EventId); } return Task.CompletedTask; } }
最后,在注册 EventBus
服务中注册 ToDoEventHandlerMonitor
:
services.AddEventBus(buidler => { // 主键事件执行监视器 buidler.AddMonitor<ToDoEventHandlerMonitor>(); });
5. 自定义事件处理程序执行器 IEventHandlerExecutor
Jaina 提供了 IEventHandlerExecutor
执行器接口,可以让开发者自定义事件处理函数执行策略,如 超时控制,失败重试、熔断等等
。
如添加 RetryEventHandlerExecutor
:
public class RetryEventHandlerExecutor : IEventHandlerExecutor { public async Task ExecuteAsync(EventHandlerExecutingContext context, Func<EventHandlerExecutingContext, Task> handler) { // 如果执行失败,每隔 1s 重试,最多三次 await Retry(async () => { await handler(context); }, 3, 1000); } }
最后,在注册 EventBus
服务中注册 RetryEventHandlerExecutor
:
services.AddEventBus(buidler => { // 主键事件执行监视器 buidler.AddExecutor<RetryEventHandlerExecutor>(); });
文档
您可以在主页找到 Jaina 文档。
贡献
该存储库的主要目的是继续发展 Jaina 核心,使其更快、更易于使用。Jaina 的开发在 Gitee 上公开进行,我们感谢社区贡献错误修复和改进。
许可证
Jaina 采用 MulanPSL-2.0 开源许可证。
Copyright (c) 2020-2021 百小僧, Baiqian Co.,Ltd. Jaina is licensed under Mulan PSL v2. You can use this software according to the terms andconditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: https://gitee.com/dotnetchina/Jaina/blob/master/LICENSE THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUTWARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details.

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ORM 框架 Bee 2021 程序员节日版(1024)发布,增强对嵌入式场景支持
Bee,互联网新时代的Java ORM工具,简单、高效,小巧(311k),开发速度快! V1.9.8.1024(2021 程序员节日版) 只有311k的Bee增强对嵌入式场景支持 可以使用指定路径的bee.properties进行配置. bee.properties可以在jar以外的目录配置。 在V1.9.8虽然有支持整合Spring boot,可以动态更新配置,但对jar大小要求特殊要求的场景,不一定适用。 此次更新,正解决了此问题。 使用实例: 实例中bee.properties放在:D:\temp中。 HoneyConfig.getHoneyConfig().resetBeeProperties("D:\\temp\\"); suid.select(new TestUser()); // 对DB操作的示例 /** * 使用指定路径的bee.properties进行配置. * 若使用第三方框架管理配置,不建议在此处重置配置. * @param filePath bee.properties所在的路径 */ public void resetBeePropert...
- 下一篇
开源公告|多模态内容理解算法框架 Lichee 开源
导语 Lichee是一个多模态内容理解算法框架项目,其中包含数据增强、预训练引擎、常见模型以及推理加速等模块。由腾讯看点内容算法研发中心研发。并于2021年在腾讯看点、腾讯视频、内容管线、QQ等业务场景均有落地,并平均减少标注样本量40%+。经过多次实践迭代,可以大幅缩短信息流内容理解需求的研发周期提升人效。此外,为QQ浏览器2021AI算法大赛-多模态视频相似度赛道提供baseline模型及代码。现将Lichee对外开源,为微服务开源社区贡献力量。 主要设计目标 1. 缩短信息流内容理解需求的研发周期 2. 集成AI领域的成熟解决方案 Lichee功能介绍以及适用场景 Lichee主框架采用分层的思想组织模型训练,通过配置文件组合 DATA、Parser、MODEL、Optimizer、Scheduler 等组件,构建具体的训练流程。此外,Lichee还提供了数据清理、推理加速等能力。 Lichee技术特点: 1. 性能优越的预训练引擎 提供了自研中文预训练模型,如LICHEE-NLG-ENGINE、LICHEE-RESNET-ENGINE等,免除训练中文预训练模型必须的大量资源和高...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL8.0.19开启GTID主从同步CentOS8