解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
2.67 KiB
X
# 消息队列事件总线QueueEventBus ## 概述 `QueueEventBus<TEvent>` 是基于消息队列的分布式事件总线,继承自 `EventBus<TEvent>`,利用 `ICache` 的后端队列(如 `MemoryQueue` 或 Redis 队列)实现跨进程的事件发布与订阅。它结合了事件总线的本地订阅分发和消息队列的异步持久化能力。 **命名空间**:`NewLife.Caching` **文档地址**:https://newlifex.com/core/queue_event_bus ## 核心特性 - **分布式事件**:事件先进入后端队列,再由后台消费循环分发给本地订阅者 - **本地订阅**:订阅/取消订阅机制与传统 `EventBus` 一致 - **跨进程投递**:使用 `ICache.GetQueue<T>(topic)` 获取队列,多进程共享 - **优雅停止**:支持 `CancellationToken` 取消后台消费循环 - **链路追踪**:实现 `ITracerFeature`,消费时可自动埋点 ## 快速开始 ```csharp using NewLife.Caching; // 创建基于内存队列的事件总线 var cache = MemoryCache.Instance; var bus = new QueueEventBus<String>(cache, "myTopic"); // 订阅事件 bus.Subscribe(msg => { Console.WriteLine($"收到: {msg}"); return Task.CompletedTask; }, "consumer1"); // 发布事件(进入队列) await bus.PublishAsync("Hello, QueueEventBus!"); // 稍等片刻,后台消费线程会处理 await Task.Delay(100); ``` ## 工作原理 ``` 发布者 ──PublishAsync──→ QueueEventBus ──Add──→ ICache队列 │ 后台消费线程 ←── TakeOneAsync │ 分发给本地订阅者 ↓ 订阅者处理器 ``` - 发布时:`PublishAsync` 将事件写入后端队列 - 订阅时:首次订阅自动启动后台消费任务 - 消费时:后台循环 `TakeOneAsync` 拉取消息,调用所有订阅者处理器 - 销毁时:取消消费任务,等待现有处理完成 ## 与 EventBus 的区别 | 特性 | `EventBus<TEvent>` | `QueueEventBus<TEvent>` | |------|-------------------|------------------------| | 事件范围 | 进程内 | 跨进程(基于缓存队列) | | 持久化 | 无 | 依赖后端队列(内存/Redis) | | 消费模型 | 同步广播 | 后台拉取 + 广播 | | 启动方式 | 即时 | 首次订阅时启动后台任务 | ## 注意事项 - 确保 `ICache` 实例支持 `IProducerConsumer<T>`(`GetQueue<T>` 方法) - 销毁实例时应调用 `Dispose` 以停止后台消费循环 - 异常不会阻止后续消息消费(`ThrowOnHandlerError` 可配置)