|
|
|
@ -5,6 +5,7 @@ using System; |
|
|
|
using System.Collections.Concurrent; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Volo.Abp; |
|
|
|
using Volo.Abp.Clients; |
|
|
|
@ -12,6 +13,7 @@ using Volo.Abp.DependencyInjection; |
|
|
|
using Volo.Abp.EventBus; |
|
|
|
using Volo.Abp.EventBus.Distributed; |
|
|
|
using Volo.Abp.Guids; |
|
|
|
using Volo.Abp.Json; |
|
|
|
using Volo.Abp.MultiTenancy; |
|
|
|
using Volo.Abp.Threading; |
|
|
|
using Volo.Abp.Timing; |
|
|
|
@ -51,10 +53,14 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// 当前客户端
|
|
|
|
/// </summary>
|
|
|
|
protected ICurrentClient CurrentClient { get; } |
|
|
|
/// <summary>
|
|
|
|
/// 取消令牌
|
|
|
|
/// </summary>
|
|
|
|
protected ICancellationTokenProvider CancellationTokenProvider { get; } |
|
|
|
/// <summary>
|
|
|
|
/// typeof <see cref="IJsonSerializer"/>
|
|
|
|
/// </summary>
|
|
|
|
protected IJsonSerializer JsonSerializer { get; } |
|
|
|
/// <summary>
|
|
|
|
/// 取消令牌
|
|
|
|
/// </summary>
|
|
|
|
protected ICancellationTokenProvider CancellationTokenProvider { get; } |
|
|
|
/// <summary>
|
|
|
|
/// constructor
|
|
|
|
/// </summary>
|
|
|
|
@ -64,6 +70,7 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// <param name="currentUser"></param>
|
|
|
|
/// <param name="currentClient"></param>
|
|
|
|
/// <param name="currentTenant"></param>
|
|
|
|
/// <param name="jsonSerializer"></param>
|
|
|
|
/// <param name="unitOfWorkManager"></param>
|
|
|
|
/// <param name="cancellationTokenProvider"></param>
|
|
|
|
/// <param name="guidGenerator"></param>
|
|
|
|
@ -75,6 +82,7 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
ICurrentUser currentUser, |
|
|
|
ICurrentClient currentClient, |
|
|
|
ICurrentTenant currentTenant, |
|
|
|
IJsonSerializer jsonSerializer, |
|
|
|
IUnitOfWorkManager unitOfWorkManager, |
|
|
|
IGuidGenerator guidGenerator, |
|
|
|
IClock clock, |
|
|
|
@ -91,6 +99,7 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
CapPublisher = capPublisher; |
|
|
|
CurrentUser = currentUser; |
|
|
|
CurrentClient = currentClient; |
|
|
|
JsonSerializer = jsonSerializer; |
|
|
|
CancellationTokenProvider = cancellationTokenProvider; |
|
|
|
CustomDistributedEventSubscriber = customDistributedEventSubscriber; |
|
|
|
HandlerFactories = new ConcurrentDictionary<Type, List<IEventHandlerFactory>>(); |
|
|
|
@ -104,9 +113,7 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// <returns></returns>
|
|
|
|
public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory) |
|
|
|
{ |
|
|
|
// 自定义的事件订阅者,可以不需要事件注册的事件类型
|
|
|
|
CustomDistributedEventSubscriber.Subscribe(eventType, factory); |
|
|
|
return new DisposeAction(() => CustomDistributedEventSubscriber.UnSubscribe(eventType, factory)); |
|
|
|
return NullDisposable.Instance; |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 退订事件
|
|
|
|
@ -115,27 +122,6 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// <param name="action"></param>
|
|
|
|
public override void Unsubscribe<TEvent>(Func<TEvent, Task> action) |
|
|
|
{ |
|
|
|
Check.NotNull(action, nameof(action)); |
|
|
|
|
|
|
|
GetOrCreateHandlerFactories(typeof(TEvent)) |
|
|
|
.Locking(factories => |
|
|
|
{ |
|
|
|
factories.RemoveAll( |
|
|
|
factory => |
|
|
|
{ |
|
|
|
if (!(factory is SingleInstanceHandlerFactory singleInstanceFactory)) |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if (!(singleInstanceFactory.HandlerInstance is ActionEventHandler<TEvent> actionHandler)) |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
return actionHandler.Action == action; |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 退订事件
|
|
|
|
@ -144,15 +130,6 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// <param name="handler">事件处理器</param>
|
|
|
|
public override void Unsubscribe(Type eventType, IEventHandler handler) |
|
|
|
{ |
|
|
|
GetOrCreateHandlerFactories(eventType) |
|
|
|
.Locking(factories => |
|
|
|
{ |
|
|
|
factories.RemoveAll( |
|
|
|
factory => |
|
|
|
factory is SingleInstanceHandlerFactory && |
|
|
|
(factory as SingleInstanceHandlerFactory).HandlerInstance == handler |
|
|
|
); |
|
|
|
}); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 退订事件
|
|
|
|
@ -161,8 +138,6 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// <param name="factory">事件处理器工厂</param>
|
|
|
|
public override void Unsubscribe(Type eventType, IEventHandlerFactory factory) |
|
|
|
{ |
|
|
|
GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Remove(factory)); |
|
|
|
CustomDistributedEventSubscriber.UnSubscribe(eventType, factory); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 退订所有事件
|
|
|
|
@ -170,7 +145,6 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
/// <param name="eventType">事件类型</param>
|
|
|
|
public override void UnsubscribeAll(Type eventType) |
|
|
|
{ |
|
|
|
GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Clear()); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 发布事件
|
|
|
|
@ -181,16 +155,7 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
protected override async Task PublishToEventBusAsync(Type eventType, object eventData) |
|
|
|
{ |
|
|
|
var eventName = EventNameAttribute.GetNameOrDefault(eventType); |
|
|
|
await CapPublisher |
|
|
|
.PublishAsync( |
|
|
|
eventName, eventData, |
|
|
|
new Dictionary<string, string> |
|
|
|
{ |
|
|
|
{ AbpCAPHeaders.UserId, CurrentUser.Id?.ToString() ?? "" }, |
|
|
|
{ AbpCAPHeaders.ClientId, CurrentClient.Id ?? "" }, |
|
|
|
{ AbpCAPHeaders.TenantId, CurrentTenant.Id?.ToString() ?? "" }, |
|
|
|
}, |
|
|
|
CancellationTokenProvider.FallbackToProvider()); |
|
|
|
await PublishAsync(eventName, eventData); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 获取事件处理器工厂列表
|
|
|
|
@ -209,19 +174,6 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
return handlerFactoryList.ToArray(); |
|
|
|
} |
|
|
|
|
|
|
|
private List<IEventHandlerFactory> GetOrCreateHandlerFactories(Type eventType) |
|
|
|
{ |
|
|
|
return HandlerFactories.GetOrAdd( |
|
|
|
eventType, |
|
|
|
type => |
|
|
|
{ |
|
|
|
var eventName = EventNameAttribute.GetNameOrDefault(type); |
|
|
|
EventTypes[eventName] = type; |
|
|
|
return new List<IEventHandlerFactory>(); |
|
|
|
} |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
private static bool ShouldTriggerEventForHandler(Type targetEventType, Type handlerEventType) |
|
|
|
{ |
|
|
|
//Should trigger same type
|
|
|
|
@ -240,26 +192,53 @@ namespace LINGYUN.Abp.EventBus.CAP |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
public override Task PublishFromOutboxAsync(OutgoingEventInfo outgoingEvent, OutboxConfig outboxConfig) |
|
|
|
public override async Task PublishFromOutboxAsync(OutgoingEventInfo outgoingEvent, OutboxConfig outboxConfig) |
|
|
|
{ |
|
|
|
// cap自行实现
|
|
|
|
return Task.CompletedTask; |
|
|
|
await PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData); |
|
|
|
} |
|
|
|
|
|
|
|
public override Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) |
|
|
|
public override async Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) |
|
|
|
{ |
|
|
|
// cap自行实现
|
|
|
|
return Task.CompletedTask; |
|
|
|
var eventType = EventTypes.GetOrDefault(incomingEvent.EventName); |
|
|
|
if (eventType == null) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
var eventJson = Encoding.UTF8.GetString(incomingEvent.EventData); |
|
|
|
var eventData = JsonSerializer.Deserialize(eventType, eventJson); |
|
|
|
var exceptions = new List<Exception>(); |
|
|
|
await TriggerHandlersAsync(eventType, eventData, exceptions, inboxConfig); |
|
|
|
if (exceptions.Any()) |
|
|
|
{ |
|
|
|
ThrowOriginalExceptions(eventType, exceptions); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
protected override byte[] Serialize(object eventData) |
|
|
|
{ |
|
|
|
throw new NotImplementedException(); |
|
|
|
var eventJson = JsonSerializer.Serialize(eventData); |
|
|
|
|
|
|
|
return Encoding.UTF8.GetBytes(eventJson); |
|
|
|
} |
|
|
|
|
|
|
|
protected override void AddToUnitOfWork(IUnitOfWork unitOfWork, UnitOfWorkEventRecord eventRecord) |
|
|
|
{ |
|
|
|
unitOfWork.AddOrReplaceDistributedEvent(eventRecord); |
|
|
|
} |
|
|
|
|
|
|
|
protected async Task PublishAsync(string eventName, object eventData) |
|
|
|
{ |
|
|
|
await CapPublisher |
|
|
|
.PublishAsync( |
|
|
|
eventName, eventData, |
|
|
|
new Dictionary<string, string> |
|
|
|
{ |
|
|
|
{ AbpCAPHeaders.UserId, CurrentUser.Id?.ToString() ?? "" }, |
|
|
|
{ AbpCAPHeaders.ClientId, CurrentClient.Id ?? "" }, |
|
|
|
{ AbpCAPHeaders.TenantId, CurrentTenant.Id?.ToString() ?? "" }, |
|
|
|
}, |
|
|
|
CancellationTokenProvider.FallbackToProvider()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|