From 5c7829bdbd6cb12bfcd9074b0ef9fd34251f438f Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Tue, 27 Oct 2026 16:32:14 +0800 Subject: [PATCH] feat: fake up --- Directory.Build.props | 2 +- src/TrackCenter.Api/TrackCenter.Api.csproj | 3 +- src/TrackCenter.Api/TrackCenterApiModule.cs | 25 ++- .../InterfaceRelayForwardReplayEvent.cs | 10 +- .../Events/OrderPodPullEvent.cs | 5 +- .../TrackChangeAfterUpdateOrderEvent.cs | 5 +- .../Events/TrackDeleteEvent.cs | 5 +- .../Events/TrackPushEvent.cs | 5 +- .../Events/TrackUpsertEvent.cs | 5 +- .../Events/TrackUpsertForRefreshEvent.cs | 2 + ...TrackChangeAfterUpdateOrderEventHandler.cs | 6 +- .../Messaging/TrackDeleteEventHandler.cs | 17 +- .../TrackPushCompletedEventHandler.cs | 71 +++----- .../Messaging/TrackPushEventHandler.cs | 5 +- .../TrackRefreshEventHandler.cs | 54 ++---- .../Messaging/TrackUpsertEventHandler.cs | 33 ++-- .../Rabbit/IRabbitHandler.cs | 10 -- .../Rabbit/RabbitClient.cs | 166 ------------------ .../Rabbit/RabbitInstrumentation.cs | 21 --- .../Rabbit/RabbitOptions.cs | 84 --------- .../Broadcasting/BroadcastingService.cs | 76 +++++--- .../ProvideServices/OrderService.Link.cs | 6 +- .../Services/ProvideServices/OrderService.cs | 4 +- .../ProvideServices/TrackPushService.cs | 10 +- .../Services/ProvideServices/TrackService.cs | 12 +- .../Services/Warning/ReturnWarningService.cs | 10 +- .../TrackCenter.Application.csproj | 3 +- .../TrackCenterApplicationModule.cs | 67 +++---- 28 files changed, 204 insertions(+), 518 deletions(-) rename src/TrackCenter.Application/{Rabbit => Events}/InterfaceRelayForwardReplayEvent.cs (70%) rename src/TrackCenter.Application/{Rabbit => Messaging}/TrackPushCompletedEventHandler.cs (65%) rename src/TrackCenter.Application/{Rabbit => Messaging}/TrackRefreshEventHandler.cs (91%) delete mode 100644 src/TrackCenter.Application/Rabbit/IRabbitHandler.cs delete mode 100644 src/TrackCenter.Application/Rabbit/RabbitClient.cs delete mode 100644 src/TrackCenter.Application/Rabbit/RabbitInstrumentation.cs delete mode 100644 src/TrackCenter.Application/Rabbit/RabbitOptions.cs diff --git a/Directory.Build.props b/Directory.Build.props index 1f5eaf03..a4b16976 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,6 +4,6 @@ - 8.0.6 + 8.0.6.2 diff --git a/src/TrackCenter.Api/TrackCenter.Api.csproj b/src/TrackCenter.Api/TrackCenter.Api.csproj index 48e85830..9dff28a6 100644 --- a/src/TrackCenter.Api/TrackCenter.Api.csproj +++ b/src/TrackCenter.Api/TrackCenter.Api.csproj @@ -20,8 +20,7 @@ - - + diff --git a/src/TrackCenter.Api/TrackCenterApiModule.cs b/src/TrackCenter.Api/TrackCenterApiModule.cs index 7af17e9d..6fbba35d 100644 --- a/src/TrackCenter.Api/TrackCenterApiModule.cs +++ b/src/TrackCenter.Api/TrackCenterApiModule.cs @@ -5,8 +5,8 @@ using Fake.AspNetCore.ExceptionHandling; using Fake.AspNetCore.Newtonsoft; using Fake.AspNetCore.Swagger; using Fake.Autofac; -using Fake.EventBus.Dashboard; -using Fake.EventBus.IntegrationEventLog; +using Fake.Messaging.Dashboard; +using Fake.Messaging.EntityFrameworkCore; using Fake.FeiShu; using Fake.Json; using Fake.Modularity; @@ -33,9 +33,8 @@ namespace TrackCenter.Api; [DependsOn(typeof(FakeAspNetCoreModule))] [DependsOn(typeof(TrackCenterApplicationModule))] [DependsOn(typeof(TrackCenterRepositoryModule))] -// RabbitMQ 物理总线之后 Replace IDistributedEventBus → Outbox(与 admin 一致) -[DependsOn(typeof(FakeEventBusIntegrationEventLogModule))] -[DependsOn(typeof(FakeEventBusDashboardModule))] +// Messaging 独立队列(Outbox/Inbox + Dashboard);物理传输由 FakeMessagingRabbitMqModule 提供 +[DependsOn(typeof(FakeMessagingDashboardModule))] [DependsOn(typeof(FakeSerilogModule))] public class TrackCenterApiModule : FakeModule { @@ -59,10 +58,11 @@ public class TrackCenterApiModule : FakeModule // 配置签名验证选项 services.Configure(configuration.GetSection("SignatureValidation")); - // Outbox / Inbox 与业务同库(EF),通过 DbTransaction 征用 SqlSugar 事务 - services.AddDbContext(options => + // Outbox / Inbox(fk_msg_*)与业务同库(EF),通过 DbTransaction 征用 SqlSugar 事务 + services.AddDbContext(options => { - var connectionString = configuration.GetConnectionString("IntegrationEventLog") + var connectionString = configuration.GetConnectionString("Messaging") + ?? configuration.GetConnectionString("IntegrationEventLog") ?? configuration.GetConnectionString("Default") ?? configuration["ConnectionStrings:Default"] ?? string.Empty; @@ -73,6 +73,13 @@ public class TrackCenterApiModule : FakeModule #endif }); + // Dashboard 路径保持 /eventbus,兼容旧书签与网关 + services.Configure(o => + { + if (string.IsNullOrWhiteSpace(o.PathMatch) || o.PathMatch == "/messaging") + o.PathMatch = "/eventbus"; + }); + // 全局授权配置:所有接口默认需要授权 services.AddMvc(options => { @@ -207,7 +214,7 @@ public class TrackCenterApiModule : FakeModule }); // 必须在 UsePathBase 之后:完整对外路径为 {PathBase}/eventbus - app.UseFakeEventBusDashboard(); + app.UseFakeMessagingDashboard(); app.Services.GetRequiredService().Send("Application started"); } diff --git a/src/TrackCenter.Application/Rabbit/InterfaceRelayForwardReplayEvent.cs b/src/TrackCenter.Application/Events/InterfaceRelayForwardReplayEvent.cs similarity index 70% rename from src/TrackCenter.Application/Rabbit/InterfaceRelayForwardReplayEvent.cs rename to src/TrackCenter.Application/Events/InterfaceRelayForwardReplayEvent.cs index 0f9144ba..c3b171ef 100644 --- a/src/TrackCenter.Application/Rabbit/InterfaceRelayForwardReplayEvent.cs +++ b/src/TrackCenter.Application/Events/InterfaceRelayForwardReplayEvent.cs @@ -1,6 +1,12 @@ -namespace TrackCenter.Application.Rabbit; +using Fake.Messaging; -public class InterfaceRelayForwardReplayEvent +namespace TrackCenter.Application.Events; + +/// +/// 接口通回调报文(外部生产,无 Fake MessageId / DLX)。 +/// +[MessageRoute(Topic = GlobalConst.InterfaceRelayExchange, TopicType = "direct")] +public class InterfaceRelayForwardReplayEvent : Message { /// /// 请求Id diff --git a/src/TrackCenter.Application/Events/OrderPodPullEvent.cs b/src/TrackCenter.Application/Events/OrderPodPullEvent.cs index 3d09e256..e30746b0 100644 --- a/src/TrackCenter.Application/Events/OrderPodPullEvent.cs +++ b/src/TrackCenter.Application/Events/OrderPodPullEvent.cs @@ -1,4 +1,4 @@ -using Fake.EventBus.Distributed; +using Fake.Messaging; namespace TrackCenter.Application.Events; @@ -6,7 +6,8 @@ namespace TrackCenter.Application.Events; /// 订单 POD 拉取(当前仓库无订阅方,仍走 Outbox 投递以兼容后续消费者)。 /// [Serializable] -public class OrderPodPullEvent : IntegrationEvent +[MessageRoute(nameof(OrderPodPullEvent))] +public class OrderPodPullEvent : Message { // 确定应用 public string AppKey { get; set; } diff --git a/src/TrackCenter.Application/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/TrackCenter.Application/Events/TrackChangeAfterUpdateOrderEvent.cs index e438598a..2f2acd1b 100644 --- a/src/TrackCenter.Application/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/TrackCenter.Application/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -1,9 +1,10 @@ -using Fake.EventBus.Distributed; +using Fake.Messaging; namespace TrackCenter.Application.Events; [Serializable] -public class TrackChangeAfterUpdateOrderEvent : IntegrationEvent +[MessageRoute(nameof(TrackChangeAfterUpdateOrderEvent))] +public class TrackChangeAfterUpdateOrderEvent : Message { /// /// 订单Id diff --git a/src/TrackCenter.Application/Events/TrackDeleteEvent.cs b/src/TrackCenter.Application/Events/TrackDeleteEvent.cs index 8cac8130..46342712 100644 --- a/src/TrackCenter.Application/Events/TrackDeleteEvent.cs +++ b/src/TrackCenter.Application/Events/TrackDeleteEvent.cs @@ -1,10 +1,11 @@ -using Fake.EventBus.Distributed; +using Fake.Messaging; using TrackCenter.Application.Dtos.ProvideServices; namespace TrackCenter.Application.Events; [Serializable] -public class TrackDeleteEvent : IntegrationEvent +[MessageRoute(nameof(TrackDeleteEvent))] +public class TrackDeleteEvent : Message { /// /// 根据esId定位轨迹,优先级最高 diff --git a/src/TrackCenter.Application/Events/TrackPushEvent.cs b/src/TrackCenter.Application/Events/TrackPushEvent.cs index 53a63a8e..bd481ed1 100644 --- a/src/TrackCenter.Application/Events/TrackPushEvent.cs +++ b/src/TrackCenter.Application/Events/TrackPushEvent.cs @@ -1,4 +1,4 @@ -using Fake.EventBus.Distributed; +using Fake.Messaging; namespace TrackCenter.Application.Events; @@ -7,7 +7,8 @@ namespace TrackCenter.Application.Events; /// 每次可传递多个订单,但仅能传递同一个轨迹内容 /// [Serializable] -public class TrackPushEvent : IntegrationEvent +[MessageRoute(nameof(TrackPushEvent))] +public class TrackPushEvent : Message { /// /// 操作类型 diff --git a/src/TrackCenter.Application/Events/TrackUpsertEvent.cs b/src/TrackCenter.Application/Events/TrackUpsertEvent.cs index ee4ac79f..1931d689 100644 --- a/src/TrackCenter.Application/Events/TrackUpsertEvent.cs +++ b/src/TrackCenter.Application/Events/TrackUpsertEvent.cs @@ -1,10 +1,11 @@ -using Fake.EventBus.Distributed; +using Fake.Messaging; using TrackCenter.Application.Dtos.ProvideServices; namespace TrackCenter.Application.Events; [Serializable] -public class TrackUpsertEvent : IntegrationEvent +[MessageRoute(nameof(TrackUpsertEvent))] +public class TrackUpsertEvent : Message { /// /// 应用 diff --git a/src/TrackCenter.Application/Events/TrackUpsertForRefreshEvent.cs b/src/TrackCenter.Application/Events/TrackUpsertForRefreshEvent.cs index ef946ab7..5aefc531 100644 --- a/src/TrackCenter.Application/Events/TrackUpsertForRefreshEvent.cs +++ b/src/TrackCenter.Application/Events/TrackUpsertForRefreshEvent.cs @@ -1,9 +1,11 @@ +using Fake.Messaging; namespace TrackCenter.Application.Events; /// /// 轨迹刷新引发的新增/更新(独立队列,与 隔离)。 /// [Serializable] +[MessageRoute(nameof(TrackUpsertForRefreshEvent))] public class TrackUpsertForRefreshEvent : TrackUpsertEvent { } diff --git a/src/TrackCenter.Application/Messaging/TrackChangeAfterUpdateOrderEventHandler.cs b/src/TrackCenter.Application/Messaging/TrackChangeAfterUpdateOrderEventHandler.cs index 0da20f58..545011fe 100644 --- a/src/TrackCenter.Application/Messaging/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/TrackCenter.Application/Messaging/TrackChangeAfterUpdateOrderEventHandler.cs @@ -1,6 +1,4 @@ -using Fake.EventBus; -using Fake.EventBus.Distributed; -using Fake.UnitOfWork; +using Fake.Messaging; using TrackCenter.Application.Events; using TrackCenter.Application.Services.Warning.Handlers; using TrackCenter.Domain.Aggregates.OrderAggregate; @@ -8,7 +6,7 @@ using TrackCenter.Domain.Aggregates.OrderAggregate; namespace TrackCenter.Application.Messaging; public class TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository, IServiceProvider serviceProvider) - : IEventHandler, ITransientDependency + : IMessageHandle, ITransientDependency { public virtual async Task HandleAsync( TrackChangeAfterUpdateOrderEvent @event, diff --git a/src/TrackCenter.Application/Messaging/TrackDeleteEventHandler.cs b/src/TrackCenter.Application/Messaging/TrackDeleteEventHandler.cs index 09105b19..da2e0850 100644 --- a/src/TrackCenter.Application/Messaging/TrackDeleteEventHandler.cs +++ b/src/TrackCenter.Application/Messaging/TrackDeleteEventHandler.cs @@ -1,5 +1,4 @@ -using Fake.EventBus; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.ProvideServices; @@ -17,23 +16,23 @@ namespace TrackCenter.Application.Messaging; public class TrackDeleteEventHandler( ProvideQueries provideQueries, IOrderRepository orderRepository, - IDistributedEventBus eventBus, + IMessagePublisher messagePublisher, ITrackDetailsEsRepository trackDetailsEsRepository, IOrderOperationRecordEsRepository orderOperationRecordEsRepository, BroadcastingService broadcastingService, WarningSignalPublisher warningSignalPublisher) - : IEventHandler, ITransientDependency + : IMessageHandle, ITransientDependency { [UnitOfWork(IsTransactional = true)] - public virtual async Task HandleAsync(TrackDeleteEvent @event, CancellationToken cancellationToken = default) + public virtual async Task HandleAsync(TrackDeleteEvent message, CancellationToken cancellationToken = default) { - if (!CanDelete(@event)) return; + if (!CanDelete(message)) return; // 处理删除轨迹 - await HandleDeleteTrackAsync(@event); + await HandleDeleteTrackAsync(message); // 根据订单关联关系异步向下刷(异步) - await DownByOrderLink(@event); + await DownByOrderLink(message); } private async Task DownByOrderLink(TrackDeleteEvent @event) @@ -77,7 +76,7 @@ public class TrackDeleteEventHandler( var subEvent = nextEvent.DeepCopy(); subEvent.OrderIds = subOrderIds; // 关联单继续走删除链路(原 CAP 误发到 Upsert topic,此处修正) - await eventBus.PublishAsync(subEvent); + await messagePublisher.PublishAsync(subEvent); } } } diff --git a/src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/TrackCenter.Application/Messaging/TrackPushCompletedEventHandler.cs similarity index 65% rename from src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs rename to src/TrackCenter.Application/Messaging/TrackPushCompletedEventHandler.cs index 5c1ed968..8567f549 100644 --- a/src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/TrackCenter.Application/Messaging/TrackPushCompletedEventHandler.cs @@ -1,63 +1,44 @@ -using System.Text; +using Fake.Messaging; using Fake.UnitOfWork; +using InterfaceForward.Domain.Shared.Helpers; using Newtonsoft.Json; -using RabbitMQ.Client.Events; using TrackCenter.Application.Dtos.TrackPush; +using TrackCenter.Application.Events; using TrackCenter.Application.Helpers; using TrackCenter.Application.Services.Broadcasting; using TrackCenter.Application.Services.Warning.Handlers; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Aggregates.TrackPushAggregate; -namespace TrackCenter.Application.Rabbit; +namespace TrackCenter.Application.Messaging; -[ExposeServices(typeof(IRabbitHandler))] -public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandler +/// +/// 接口通轨迹推送完成回调 → 独立队列 。 +/// +[MessageSubscribe(GlobalConst.TrackPushCompletedSubscribe, ExternalQueue = true)] +public class TrackPushCompletedEventHandler( + IOrderRepository orderRepository, + ITrackPushRecordEsRepository trackPushRecordEsRepository, + BroadcastingService broadcastingService, + IReturnWarningHandler returnWarningHandler) + : IMessageHandle, ITransientDependency { - private readonly IOrderRepository _orderRepository; - private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; - private readonly BroadcastingService _broadcastingService; - private readonly IReturnWarningHandler _returnWarningHandler; - - public TrackPushCompletedEventHandler(IOrderRepository orderRepository, - ITrackPushRecordEsRepository trackPushRecordEsRepository, - BroadcastingService broadcastingService, IReturnWarningHandler returnWarningHandler) + public virtual async Task HandleAsync( + InterfaceRelayForwardReplayEvent message, + CancellationToken cancellationToken = default) { - _orderRepository = orderRepository; - _trackPushRecordEsRepository = trackPushRecordEsRepository; - _broadcastingService = broadcastingService; - _returnWarningHandler = returnWarningHandler; - } - - public bool Enable(ConsumeOptions options) - { - return options.Queue.StartsWith(GlobalConst.TrackPushCompletedSubscribe); - } - - [UnitOfWork(IsTransactional = true)] - public virtual async Task Handle(BasicDeliverEventArgs args) - { - var msg = string.Empty; try { - msg = Encoding.UTF8.GetString(args.Body.ToArray()); - var @event = System.Text.Json.JsonSerializer.Deserialize(msg); - if (@event == null) - { - Log.Warning( - $"rabbit on queue received msg can't convert to {nameof(InterfaceRelayForwardReplayEvent)}"); - return; - } - - await ConsumerAsync(@event); + await ConsumerAsync(message); } catch (Exception ex) { - Log.Error($"TrackPushCompletedEventHandler出错,错误信息:{ex}\r\n-----\r\n消息:{msg}"); + Log.Error($"TrackPushCompletedEventHandler出错,错误信息:{ex}\r\n-----\r\n消息:{message.ToJson()}"); + throw; } } - public async Task ConsumerAsync(InterfaceRelayForwardReplayEvent @event) + private async Task ConsumerAsync(InterfaceRelayForwardReplayEvent @event) { var optionType = Base64Helper.DeSerialize(@event.Attach); var pushInputs = new List(); @@ -91,16 +72,16 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl // 推送广播 if (logs.First().IsToMq) - _broadcastingService.TrackPushCompletedPublicTopic(logs.Select(log => BuildDto(log, @event.Data)).ToList()); + broadcastingService.TrackPushCompletedPublicTopic(logs.Select(log => BuildDto(log, @event.Data)).ToList()); // 写入推送日志 - await _trackPushRecordEsRepository.AddManyAsync(logs); + await trackPushRecordEsRepository.AddManyAsync(logs); // 同步更新订单主表 await TrackPushAfterUpdateOrderAsync(isAdd, @event.IsSuccess, logs); // 引发预警计算 - await _returnWarningHandler.ReceiveTrackPushRecordHandleAsync(@event.IsSuccess, @event.RequestParams, logs, pushInputs, updateInputs); + await returnWarningHandler.ReceiveTrackPushRecordHandleAsync(@event.IsSuccess, @event.RequestParams, logs, pushInputs, updateInputs); } private async Task TrackPushAfterUpdateOrderAsync(bool isAdd, bool isSuccess, List logs) @@ -118,7 +99,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl LatestPushError = x.Message }).ToList(); - await _orderRepository.UpdateRangeAsync(orders, x => new + await orderRepository.UpdateRangeAsync(orders, x => new { x.QuestionType, x.LatestPushError @@ -136,7 +117,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl LatestPushTime = x.CreateTime, }).ToList(); - await _orderRepository.UpdateRangeAsync(orders, x => new + await orderRepository.UpdateRangeAsync(orders, x => new { x.QuestionType, x.LatestPushError, diff --git a/src/TrackCenter.Application/Messaging/TrackPushEventHandler.cs b/src/TrackCenter.Application/Messaging/TrackPushEventHandler.cs index 206796f1..8f852117 100644 --- a/src/TrackCenter.Application/Messaging/TrackPushEventHandler.cs +++ b/src/TrackCenter.Application/Messaging/TrackPushEventHandler.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using System.Text.Json; -using Fake.EventBus; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.Extensions.Options; @@ -29,7 +28,7 @@ public class TrackPushEventHandler( BroadcastingService broadcastingService, ITrackDetailsEsRepository trackDetailsEsRepository, InterfaceForwardService interfaceForwardService) - : IEventHandler, ITransientDependency + : IMessageHandle, ITransientDependency { private List _orders = null!; private List _pushConfigs = null!; diff --git a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs b/src/TrackCenter.Application/Messaging/TrackRefreshEventHandler.cs similarity index 91% rename from src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs rename to src/TrackCenter.Application/Messaging/TrackRefreshEventHandler.cs index ade732fe..544e4251 100644 --- a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/TrackCenter.Application/Messaging/TrackRefreshEventHandler.cs @@ -1,13 +1,11 @@ using System.Diagnostics; -using System.Text; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using RabbitMQ.Client.Events; using TrackCenter.Application.Dtos.TrackPull; using TrackCenter.Application.Events; using TrackCenter.Application.Helpers; @@ -16,47 +14,37 @@ using TrackCenter.Application.Services.TrackPull; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Aggregates.TrackDetailsAggregate; -namespace TrackCenter.Application.Rabbit; +namespace TrackCenter.Application.Messaging; -[ExposeServices(typeof(IRabbitHandler))] +/// +/// 接口通轨迹刷新回调 → 独立队列 。 +/// +[MessageSubscribe(GlobalConst.TrackRefreshSubscribe, ExternalQueue = true)] public class TrackRefreshEventHandler( IOrderRepository orderRepository, - IDistributedEventBus eventBus, + IMessagePublisher messagePublisher, TrackPullCacheService trackPullCacheService, ITrackDetailsEsRepository trackDetailsEsRepository, ILogger logger, IOptionsMonitor options) - : ITransientDependency, IRabbitHandler + : IMessageHandle, ITransientDependency { - public bool Enable(ConsumeOptions coptions) + public virtual async Task HandleAsync( + InterfaceRelayForwardReplayEvent message, + CancellationToken cancellationToken = default) { - return coptions.Queue.StartsWith(GlobalConst.TrackRefreshSubscribe); - } - - [UnitOfWork(IsTransactional = true)] - public virtual async Task Handle(BasicDeliverEventArgs args) - { - var msg = string.Empty; try { - msg = Encoding.UTF8.GetString(args.Body.ToArray()); - var @event = System.Text.Json.JsonSerializer.Deserialize(msg); - if (@event == null) - { - logger.LogWarning( - $"rabbit on queue received msg can't convert to {nameof(InterfaceRelayForwardReplayEvent)}"); - return; - } - - await ConsumerAsync(@event); + await ConsumerAsync(message); } catch (Exception ex) { - Log.Error($"TrackRefreshEventHandler出错,错误信息:{ex}\r\n-----\r\n消息:{msg}"); + Log.Error($"TrackRefreshEventHandler出错,错误信息:{ex}\r\n-----\r\n消息:{message.ToJson()}"); + throw; } } - public async Task ConsumerAsync(InterfaceRelayForwardReplayEvent @event) + private async Task ConsumerAsync(InterfaceRelayForwardReplayEvent @event) { if (!@event.IsSuccess) { @@ -71,15 +59,6 @@ public class TrackRefreshEventHandler( return; } - // 最优先级,最匹配的 权重 sort - - // 客户、渠道、产品 - // */*/* 全部 - // 客户A/渠道A/产品A - // 客户A - - // 客户A 渠道B 产品A - var config = await trackPullCacheService.GetPullParamsWithContentAsync(attach.AppKey, attach.ServiceProviderCode, attach.OrderType); if (config is null) @@ -134,7 +113,6 @@ public class TrackRefreshEventHandler( ServiceProviderCode = attach.ServiceProviderCode }; - if (trackToken is JArray trackTokens) { foreach (var item in trackTokens) @@ -284,7 +262,7 @@ public class TrackRefreshEventHandler( Extra = trackExtra }; - await eventBus.PublishAsync(trackUpsertEvent); + await messagePublisher.PublishAsync(trackUpsertEvent); } private async Task InsertNotMappedTrackAsync(JToken trackToken, TrackRefreshContext context, string? trackPlace, diff --git a/src/TrackCenter.Application/Messaging/TrackUpsertEventHandler.cs b/src/TrackCenter.Application/Messaging/TrackUpsertEventHandler.cs index 461d37eb..c464502f 100644 --- a/src/TrackCenter.Application/Messaging/TrackUpsertEventHandler.cs +++ b/src/TrackCenter.Application/Messaging/TrackUpsertEventHandler.cs @@ -1,5 +1,4 @@ -using Fake.EventBus; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Events; @@ -18,30 +17,22 @@ namespace TrackCenter.Application.Messaging; public class TrackUpsertEventHandler( IOrderRepository orderRepository, - IDistributedEventBus eventBus, + IMessagePublisher messagePublisher, ProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository, IOrderOperationRecordEsRepository orderOperationRecordEsRepository, BroadcastingService broadcastingService, WarningSignalPublisher warningSignalPublisher) : - IEventHandler, - IEventHandler, + IMessageHandle, + IMessageHandle, ITransientDependency { - Task IEventHandler.HandleAsync(Event eventData, CancellationToken cancellationToken) - => eventData switch - { - TrackUpsertForRefreshEvent refresh => HandleAsync(refresh, cancellationToken), - TrackUpsertEvent upsert => HandleAsync(upsert, cancellationToken), - _ => Task.CompletedTask - }; + public Task HandleAsync(TrackUpsertEvent message, CancellationToken cancellationToken = default) + => ConsumerAsync(message); - public Task HandleAsync(TrackUpsertEvent @event, CancellationToken cancellationToken = default) - => ConsumerAsync(@event); - - public Task HandleAsync(TrackUpsertForRefreshEvent @event, CancellationToken cancellationToken = default) - => ConsumerAsync(@event); + public Task HandleAsync(TrackUpsertForRefreshEvent message, CancellationToken cancellationToken = default) + => ConsumerAsync(message); private async Task ConsumerAsync(TrackUpsertEvent @event) { @@ -107,7 +98,7 @@ public class TrackUpsertEventHandler( { var subEvent = nextEvent.DeepCopy(); subEvent.OrderIdentifiers = subOrderIds.ToArray(); - await eventBus.PublishAsync(subEvent); + await messagePublisher.PublishAsync(subEvent); } } } @@ -200,7 +191,7 @@ public class TrackUpsertEventHandler( // 如果存在轨迹标记,则触发订单pod拉取 if (!string.IsNullOrWhiteSpace(trackContent.TrackFlagId)) { - await eventBus.PublishAsync(new OrderPodPullEvent + await messagePublisher.PublishAsync(new OrderPodPullEvent { AppKey = @event.AppKey, OrderIdEsIdDict = insertTracks.ToDictionary(x => x.OrderId, y => y.Id), @@ -213,7 +204,7 @@ public class TrackUpsertEventHandler( await TrackChangePublicTopicAsync(trackContent, trackChangeEtos, true); // 触发订单主表更新事件(异步) - await eventBus.PublishAsync(new TrackChangeAfterUpdateOrderEvent + await messagePublisher.PublishAsync(new TrackChangeAfterUpdateOrderEvent { OrderIds = canNextOrderIds.ToArray(), IsCompleted = trackContent.IsCompleted, @@ -248,7 +239,7 @@ public class TrackUpsertEventHandler( ForcedPush = @event.ForcedPush, IsToMq = (trackContent.IsToMq || @event.IsToMq) }; - await eventBus.PublishAsync(trackPushEvent); + await messagePublisher.PublishAsync(trackPushEvent); } private async Task> UpsertTrackAsync( diff --git a/src/TrackCenter.Application/Rabbit/IRabbitHandler.cs b/src/TrackCenter.Application/Rabbit/IRabbitHandler.cs deleted file mode 100644 index 19635f18..00000000 --- a/src/TrackCenter.Application/Rabbit/IRabbitHandler.cs +++ /dev/null @@ -1,10 +0,0 @@ -using RabbitMQ.Client.Events; - -namespace TrackCenter.Application.Rabbit; - -public interface IRabbitHandler -{ - bool Enable(ConsumeOptions options); - - Task Handle(BasicDeliverEventArgs args); -} diff --git a/src/TrackCenter.Application/Rabbit/RabbitClient.cs b/src/TrackCenter.Application/Rabbit/RabbitClient.cs deleted file mode 100644 index ac0ebdae..00000000 --- a/src/TrackCenter.Application/Rabbit/RabbitClient.cs +++ /dev/null @@ -1,166 +0,0 @@ -using Fake.RabbitMQ; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using RabbitMQ.Client; -using RabbitMQ.Client.Events; - -namespace TrackCenter.Application.Rabbit; - -public class RabbitClient( - IRabbitMqChannelPool channelPool, - IServiceScopeFactory serviceScopeFactory, - ILogger logger, - IOptions options) : ISingletonDependency, IHostedService -{ - public void Subscribe(ConsumeOptions consumeOptions) - { - using var channelAccessor = channelPool.Acquire(consumeOptions.Queue); - - if (!channelAccessor.IsNew) return; - var channel = channelAccessor.Channel; - var decl = new DefaultDeclaration(channel); - - consumeOptions.Declaration.Invoke(decl); - - if (consumeOptions.FetchCount > 0) - { - channel.BasicQos(0, consumeOptions.FetchCount, false); - } - - var consumer = new AsyncEventingBasicConsumer(channel); - consumer.Received += (model, ea) => - { - _ = Task.Run(async () => - { - try - { - await using var scope = serviceScopeFactory.CreateAsyncScope(); - foreach (var handler in scope.ServiceProvider.GetServices()) - { - if (handler.Enable(consumeOptions)) - { - await handler.Handle(ea); - } - } - channel.BasicAck(ea.DeliveryTag, false); - } - catch (Exception ex) - { - logger.LogError($"rabbit on queue({consumeOptions.Queue}) received error: {ex}"); - channel.BasicNack(ea.DeliveryTag, false, consumeOptions.FailedRequeue); - } - }); - - return Task.CompletedTask; - }; - - channel.CallbackException += (sender, args) => - { - logger.LogError(args.Exception, "RabbitMQ channel exception"); - }; - - channel.BasicConsume(queue: consumeOptions.Queue, - autoAck: false, - consumer: consumer); - } - - public void Publish(string exchange, string routingKey, byte[] data, Action? options = null) - { - using var channelAccessor = channelPool.Acquire(routingKey); - var props = channelAccessor.Channel.CreateBasicProperties(); - options?.Invoke(props); - channelAccessor.Channel.BasicPublish(exchange, routingKey, props, data); - } - - public void PublishByConfirmSelect( - string exchange, - string routingKey, - byte[] data, - Action? options = null - ) - { - using var activity = RabbitInstrumentation.ActivitySource.StartActivity("/" + exchange + "/" + routingKey); - activity?.SetTag("kind", "publish"); - using var channelAccessor = channelPool.Acquire(routingKey); - var basicProperties = channelAccessor.Channel.CreateBasicProperties(); - - // 配置属性 - if (options != null) - options(basicProperties); - var model = channelAccessor.Channel; - - // 启用发布确认 - model.ConfirmSelect(); - var readOnlyMemory = (ReadOnlyMemory) data; - model.BasicPublish(exchange, routingKey, basicProperties, readOnlyMemory); - model.WaitForConfirmsOrDie(); - } - - public void PublishByConfirmSelect( - string exchange, - string routingKey, - IEnumerable datas, - Action? options = null - ) - { - using var activity = RabbitInstrumentation.ActivitySource.StartActivity("/" + exchange + "/" + routingKey); - activity?.SetTag("kind", "publish"); - using var channelAccessor = channelPool.Acquire(routingKey); - var basicProperties = channelAccessor.Channel.CreateBasicProperties(); - - // 配置属性 - if (options != null) - options(basicProperties); - var model = channelAccessor.Channel; - - // 启用发布确认 - model.ConfirmSelect(); - foreach (var data in datas) - { - var readOnlyMemory = (ReadOnlyMemory) data; - model.BasicPublish(exchange, routingKey, basicProperties, readOnlyMemory); - } - - model.WaitForConfirmsOrDie(); - } - - public void UnSubscribe(string queueName, string exchange, string routingKey, bool deleteQueue = false) - { - logger.LogInformation( - $"UnSubscribe queue: {queueName} exchange: {exchange} routingKey: {routingKey} deleteQueue: {deleteQueue}"); - using var channelAccessor = channelPool.Acquire(queueName); - if (deleteQueue) - { - var passive = channelAccessor.Channel.QueueDeclarePassive(queueName); - logger.LogInformation($"Queue {queueName} exists, deleting... {passive.MessageCount} messages in queue"); - channelAccessor.Channel.QueueDelete(queueName); - } - - channelPool.Release(queueName); - } - - public Task StartAsync(CancellationToken cancellationToken) - { - if (options.Value.Declarations.Count > 0) - { - using var channelAccessor = channelPool.Acquire(); - var channel = channelAccessor.Channel; - var decl = new DefaultDeclaration(channel); - options.Value.Declarations.ForEach(q => q.Invoke(decl)); - } - - foreach (var opt in options.Value.Consumes) - { - Subscribe(opt); - } - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - channelPool.Dispose(); - return Task.CompletedTask; - } -} diff --git a/src/TrackCenter.Application/Rabbit/RabbitInstrumentation.cs b/src/TrackCenter.Application/Rabbit/RabbitInstrumentation.cs deleted file mode 100644 index 2afdc420..00000000 --- a/src/TrackCenter.Application/Rabbit/RabbitInstrumentation.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Diagnostics; -using System.Diagnostics.Metrics; - -namespace TrackCenter.Application.Rabbit; - -public class RabbitInstrumentation -{ - public const string MeterName = "Fake.Rabbit.Meter"; - public const string ActivitySourceName = "Fake.Rabbit.ActivitySource"; - - static RabbitInstrumentation() - { - string version = typeof (RabbitInstrumentation).Assembly.GetName().Version?.ToString(); - Meter = new Meter(MeterName, version); - ActivitySource = new ActivitySource(ActivitySourceName, version); - } - - public static Meter Meter { get; } - - public static ActivitySource ActivitySource { get; } -} diff --git a/src/TrackCenter.Application/Rabbit/RabbitOptions.cs b/src/TrackCenter.Application/Rabbit/RabbitOptions.cs deleted file mode 100644 index 258f5ea7..00000000 --- a/src/TrackCenter.Application/Rabbit/RabbitOptions.cs +++ /dev/null @@ -1,84 +0,0 @@ -using RabbitMQ.Client; - -namespace TrackCenter.Application.Rabbit; - -public class RabbitOptions -{ - public List Consumes { get; set; } = new(); - - public List> Declarations { get; set; } = new(); -} - -public class ConsumeOptions -{ - /// - /// 队列名 - /// - public string Queue { get; set; } - - /// - /// 并行度 - /// - public ushort FetchCount { get; set; } = 1; - - /// - /// handle发生异常,是否重回队列 - /// - public bool FailedRequeue { get; set; } - - public Action Declaration { get; set; } -} - -public interface IDeclaration -{ - void QueueDeclare(string queue, bool durable, bool autoDelete = false, bool exclusive = false, - IDictionary arguments = null); - - void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete = false, - IDictionary arguments = null); - - void QueueBind(string queue, string exchange, string routingKey, - IDictionary arguments = null); -} - -public class DefaultDeclaration : IDeclaration -{ - private readonly IModel _chnl; - - // ReSharper disable once ConvertToPrimaryConstructor - public DefaultDeclaration(IModel chnl) - { - _chnl = chnl; - } - - public void QueueDeclare(string queue, bool durable, bool autoDelete = false, bool exclusive = false, - IDictionary arguments = null) - { - _chnl.QueueDeclare( - queue: queue, - durable: durable, - autoDelete: autoDelete, - exclusive: exclusive, - arguments: arguments); - } - - public void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete = false, - IDictionary arguments = null) - { - _chnl.ExchangeDeclare( - exchange: exchange, - type: type, - durable: durable, - autoDelete: autoDelete, - arguments: arguments); - } - - public void QueueBind(string queue, string exchange, string routingKey, IDictionary arguments) - { - _chnl.QueueBind( - queue: queue, - exchange: exchange, - routingKey: routingKey, - arguments: arguments); - } -} diff --git a/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs b/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs index 16468571..36c15a6d 100644 --- a/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs @@ -1,74 +1,102 @@ using System.Text; +using Fake.RabbitMQ; using InterfaceForward.Domain.Shared.Helpers; +using RabbitMQ.Client; using TrackCenter.Application.Dtos.TrackPush; using TrackCenter.Application.Events; -using TrackCenter.Application.Rabbit; namespace TrackCenter.Application.Services.Broadcasting; /// -/// 广播服务 +/// 对外 Topic 广播(下游仍按 Newtonsoft PascalCase 契约消费,不经 Messaging 信封)。 /// -public class BroadcastingService : ITransientDependency +public class BroadcastingService(IRabbitMqChannelPool channelPool) : ITransientDependency { - private readonly RabbitClient _rabbitClient; - - public BroadcastingService(RabbitClient rabbitClient) + public void TrackChangePublicTopic(TrackChangeEto eto, string AppCode) { - _rabbitClient = rabbitClient; - } - - public void TrackChangePublicTopic(TrackChangeEto eto, string AppCode) - { - _rabbitClient.PublishByConfirmSelect( + PublishByConfirmSelect( GlobalConst.TrackChangeExchange, + ExchangeType.Topic, $"TrackChange.{AppCode}", Encoding.UTF8.GetBytes(eto.ToJson()), - prop => { prop.Persistent = true; } - ); + prop => { prop.Persistent = true; }); } /// /// 轨迹推送完成广播(批量) /// - /// - /// public void TrackPushCompletedPublicTopic(List list) { var data = list .Select(TrackPushRecordDtoToEvent) .Select(x => Encoding.UTF8.GetBytes(x.ToJson())); var log = list.First(); - _rabbitClient.PublishByConfirmSelect( + PublishByConfirmSelect( GlobalConst.TrackPushExchange, + ExchangeType.Topic, $"TrackPush.{log.AppKey}", data, - prop => { prop.Persistent = true; } - ); + prop => { prop.Persistent = true; }); } /// /// 轨迹推送完成广播 /// - /// - /// public void TrackPushCompletedPublicTopic(TrackPushRecordDto log) { var data = TrackPushRecordDtoToEvent(log); - _rabbitClient.PublishByConfirmSelect(GlobalConst.TrackPushExchange, $"TrackPush.{log.AppKey}", - Encoding.UTF8.GetBytes(data.ToJson()), prop => { prop.Persistent = true; }); + PublishByConfirmSelect( + GlobalConst.TrackPushExchange, + ExchangeType.Topic, + $"TrackPush.{log.AppKey}", + Encoding.UTF8.GetBytes(data.ToJson()), + prop => { prop.Persistent = true; }); } /// /// 轨迹推送失败广播 /// - /// public void TrackPushFailedPubilcTopic(TrackPushRecordDto log) { //暂时使用推送完成模型,后续可能会出现有区分度的模型 TrackPushCompletedPublicTopic(log); } + private void PublishByConfirmSelect( + string exchange, + string exchangeType, + string routingKey, + byte[] data, + Action? options = null) + { + using var channelAccessor = channelPool.Acquire(routingKey); + var channel = channelAccessor.Channel; + channel.ExchangeDeclare(exchange, exchangeType, durable: true); + var props = channel.CreateBasicProperties(); + options?.Invoke(props); + channel.ConfirmSelect(); + channel.BasicPublish(exchange, routingKey, props, data); + channel.WaitForConfirmsOrDie(); + } + + private void PublishByConfirmSelect( + string exchange, + string exchangeType, + string routingKey, + IEnumerable datas, + Action? options = null) + { + using var channelAccessor = channelPool.Acquire(routingKey); + var channel = channelAccessor.Channel; + channel.ExchangeDeclare(exchange, exchangeType, durable: true); + var props = channel.CreateBasicProperties(); + options?.Invoke(props); + channel.ConfirmSelect(); + foreach (var data in datas) + channel.BasicPublish(exchange, routingKey, props, data); + channel.WaitForConfirmsOrDie(); + } + private static TrackPushCompletedEvent TrackPushRecordDtoToEvent(TrackPushRecordDto log) { return new TrackPushCompletedEvent diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs index 3371500e..89387578 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs @@ -1,5 +1,5 @@ using System.Data; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Events; @@ -13,7 +13,7 @@ namespace TrackCenter.Application.Services.ProvideServices; /// public partial class OrderService { - private readonly IDistributedEventBus _eventBus = eventBus; + private readonly IMessagePublisher _messagePublisher = messagePublisher; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository = trackDetailsEsRepository; /// @@ -130,7 +130,7 @@ public partial class OrderService IsAdd = true // 存在则不新增 }; - await _eventBus.PublishAsync(fillTrackEvent); + await _messagePublisher.PublishAsync(fillTrackEvent); } } diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs index 9211d0e2..6ccfa095 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs @@ -1,4 +1,4 @@ -using Fake.EventBus.Distributed; +using Fake.Messaging; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Aggregates.TrackDetailsAggregate; @@ -17,7 +17,7 @@ public partial class OrderService( IOrderRepository orderRepository, IOrderOperationRecordEsRepository orderOperationRecordEsRepository, ITrackPullConfigRepository trackPullConfigRepository, - IDistributedEventBus eventBus, + IMessagePublisher messagePublisher, ITrackDetailsEsRepository trackDetailsEsRepository, IServiceProvider serviceProvider) : ApplicationServiceBase diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs index f371e4ba..fe595f5d 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs @@ -1,5 +1,5 @@ using System.Data; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Dtos.TrackOrder; @@ -20,20 +20,20 @@ namespace TrackCenter.Application.Services.ProvideServices; [Route("/ProviderService")] public class TrackPushService : ApplicationServiceBase { - private readonly IDistributedEventBus _eventBus; + private readonly IMessagePublisher _messagePublisher; private readonly IOrderRepository _orderRepository; private readonly ITrackPushConfigRepository _trackPushConfigRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; public TrackPushService(IOrderRepository orderRepository - , IDistributedEventBus eventBus + , IMessagePublisher messagePublisher , ITrackPushRecordEsRepository trackPushRecordEsRepository , ITrackPushConfigRepository trackPushConfigRepository, ITrackDetailsEsRepository trackDetailsEsRepository) { _orderRepository = orderRepository; - _eventBus = eventBus; + _messagePublisher = messagePublisher; _trackPushRecordEsRepository = trackPushRecordEsRepository; _trackPushConfigRepository = trackPushConfigRepository; _trackDetailsEsRepository = trackDetailsEsRepository; @@ -155,7 +155,7 @@ public class TrackPushService : ApplicationServiceBase } }; - await _eventBus.PublishAsync(trackPushEvent); + await _messagePublisher.PublishAsync(trackPushEvent); pushedOrderNos.Add(order.OrderNo); } diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs index 0a4d22e0..fba94972 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs @@ -1,5 +1,5 @@ using System.Data; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.UnitOfWork; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.ProvideServices; @@ -19,7 +19,7 @@ namespace TrackCenter.Application.Services.ProvideServices; [Route("/ProviderService")] public partial class TrackService( IOrderRepository orderRepository, - IDistributedEventBus eventBus, + IMessagePublisher messagePublisher, ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository) : ApplicationServiceBase @@ -90,7 +90,7 @@ public partial class TrackService( } // 删除轨迹(异步) - await eventBus.PublishAsync(new TrackDeleteEvent + await messagePublisher.PublishAsync(new TrackDeleteEvent { EsIds = esIds, OrderIds = new[] { orderId }, @@ -165,7 +165,7 @@ public partial class TrackService( AppKey = input.AppKey, OperationMan = CurrentUser.UserName }; - await eventBus.PublishAsync(@event); + await messagePublisher.PublishAsync(@event); } /// @@ -219,7 +219,7 @@ public partial class TrackService( } }; @event.OperationMan = CurrentUser.UserName; - await eventBus.PublishAsync(@event); + await messagePublisher.PublishAsync(@event); } /// @@ -292,7 +292,7 @@ public partial class TrackService( ForcedPush = input.ForcedPush, IsToMq = input.IsToMq, }; - await eventBus.PublishAsync(@event); + await messagePublisher.PublishAsync(@event); } } diff --git a/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs b/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs index 368d0c6d..c420c49f 100644 --- a/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs +++ b/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs @@ -1,5 +1,5 @@ using System.Data; -using Fake.EventBus.Distributed; +using Fake.Messaging; using Fake.Domain.Dtos; using Fake.UnitOfWork; using InterfaceForward.Domain.Shared.Helpers; @@ -27,7 +27,7 @@ public class ReturnWarningService : ApplicationServiceBase private readonly IReturnWarningHandler _returnWarningHandler; private readonly IWarningRuleRepository _warningRuleRepository; private readonly IWarningDetailsEsRepository _warningDetailsEsRepository; - private readonly IDistributedEventBus _eventBus; + private readonly IMessagePublisher _messagePublisher; private readonly TrackStatusNameDictCache _trackStatusNameDictCache; private readonly AppNameDictCache _appNameDictCache; @@ -36,7 +36,7 @@ public class ReturnWarningService : ApplicationServiceBase IReturnWarningHandler returnWarningHandler, IWarningRuleRepository warningRuleRepository, IWarningDetailsEsRepository warningDetailsEsRepository, - IDistributedEventBus eventBus, + IMessagePublisher messagePublisher, TrackStatusNameDictCache trackStatusNameDictCache, AppNameDictCache appNameDictCache ) @@ -45,7 +45,7 @@ public class ReturnWarningService : ApplicationServiceBase _returnWarningHandler = returnWarningHandler; _warningRuleRepository = warningRuleRepository; _warningDetailsEsRepository = warningDetailsEsRepository; - _eventBus = eventBus; + _messagePublisher = messagePublisher; _trackStatusNameDictCache = trackStatusNameDictCache; _appNameDictCache = appNameDictCache; } @@ -279,7 +279,7 @@ public class ReturnWarningService : ApplicationServiceBase } }; - await _eventBus.PublishAsync(trackPushEvent); + await _messagePublisher.PublishAsync(trackPushEvent); } return $"即将进行{filtered.Count}个回传推送!"; diff --git a/src/TrackCenter.Application/TrackCenter.Application.csproj b/src/TrackCenter.Application/TrackCenter.Application.csproj index ccab7abc..43dd17cb 100644 --- a/src/TrackCenter.Application/TrackCenter.Application.csproj +++ b/src/TrackCenter.Application/TrackCenter.Application.csproj @@ -9,8 +9,7 @@ - - + diff --git a/src/TrackCenter.Application/TrackCenterApplicationModule.cs b/src/TrackCenter.Application/TrackCenterApplicationModule.cs index 4c0de9ef..dd7535d1 100644 --- a/src/TrackCenter.Application/TrackCenterApplicationModule.cs +++ b/src/TrackCenter.Application/TrackCenterApplicationModule.cs @@ -1,28 +1,26 @@ using System.Diagnostics; using System.Net; using Fake; -using Fake.EventBus.RabbitMQ; +using Fake.Messaging; +using Fake.Messaging.RabbitMQ; using Fake.Modularity; using Fake.ObjectMapping.AutoMapper; using Fake.ObjectStorage; -using Fake.RabbitMQ; using FreeRedis; using Hangfire; using Hangfire.Redis.StackExchange; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using RabbitMQ.Client; -using TrackCenter.Application.Kafka; using TrackCenter.Application.HostServices; +using TrackCenter.Application.Kafka; +using TrackCenter.Application.Messaging; using TrackCenter.Application.Options; -using TrackCenter.Application.Rabbit; namespace TrackCenter.Application; -[DependsOn(typeof(FakeRabbitMqModule))] [DependsOn(typeof(FakeObjectMappingAutoMapperModule))] -[DependsOn(typeof(FakeEventBusRabbitMqModule))] +[DependsOn(typeof(FakeMessagingRabbitMqModule))] [DependsOn(typeof(FakeObjectStorageTencentCosModule))] [DependsOn(typeof(TrackCenterDomainModule))] public class TrackCenterApplicationModule : FakeModule @@ -36,50 +34,27 @@ public class TrackCenterApplicationModule : FakeModule options.ScanProfiles(); }); + // Messaging:独立队列;PrefetchCount=0 → ProcessorCount;接口通可按 TrackApp:TrackRefreshFetchCount 覆盖 + context.Services.Configure(configuration.GetSection(MessagingOptions.SectionName)); + context.Services.Configure(o => + { + configuration.GetSection(RabbitMessageOptions.SectionName).Bind(o); + + var refreshFetch = configuration.GetValue("TrackApp:TrackRefreshFetchCount"); + if (refreshFetch > 0) + { + o.Handlers[nameof(TrackRefreshEventHandler)] = + new RabbitMessageHandlerOptions { PrefetchCount = refreshFetch }; + o.Handlers[nameof(TrackPushCompletedEventHandler)] = + new RabbitMessageHandlerOptions { PrefetchCount = refreshFetch }; + } + }); + var redisOptions = configuration.GetSection("Redis").Get(); if (redisOptions == null) throw new FakeException("未找到Redis相关配置,请检查配置文件中是否包含名为Redis的节点"); RedisHelper.Init(redisOptions, showLogInfo: Debugger.IsAttached); - context.Services.AddHostedService(); - context.Services.Configure(options => - { - options.Declarations = new List>() - { - o => o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true), - o => o.ExchangeDeclare(GlobalConst.TrackPushExchange, ExchangeType.Topic, true) - }; - options.Consumes = new List - { - new() - { - Queue = GlobalConst.TrackRefreshSubscribe, - FetchCount = configuration.GetValue("TrackApp:TrackRefreshFetchCount"), - FailedRequeue = false, - Declaration = o => - { - o.ExchangeDeclare(GlobalConst.InterfaceRelayExchange, ExchangeType.Direct, true); - o.QueueDeclare(GlobalConst.TrackRefreshSubscribe, true); - o.QueueBind(GlobalConst.TrackRefreshSubscribe, GlobalConst.InterfaceRelayExchange, - GlobalConst.TrackRefreshSubscribe); - } - }, - new() - { - Queue = GlobalConst.TrackPushCompletedSubscribe, - FetchCount = configuration.GetValue("TrackApp:TrackRefreshFetchCount"), - FailedRequeue = false, - Declaration = o => - { - o.ExchangeDeclare(GlobalConst.InterfaceRelayExchange, ExchangeType.Direct, true); - o.QueueDeclare(GlobalConst.TrackPushCompletedSubscribe, true); - o.QueueBind(GlobalConst.TrackPushCompletedSubscribe, GlobalConst.InterfaceRelayExchange, - GlobalConst.TrackPushCompletedSubscribe); - } - } - }; - }); - context.Services.Configure(configuration.GetSection("TrackApp")); context.Services.Configure( configuration.GetSection("InterfaceRelayParamsConfig"));