/// <summary> /// 依赖注入统一方法 /// </summary> protected async virtual ValueTask DependencyInjection() { CoreOptions = ServiceProvider.GetOptionsByName <CoreOptions>(GrainType.FullName); ArchiveOptions = ServiceProvider.GetOptionsByName <ArchiveOptions>(GrainType.FullName); Logger = (ILogger)ServiceProvider.GetService(typeof(ILogger <>).MakeGenericType(GrainType)); ProducerContainer = ServiceProvider.GetService <IProducerContainer>(); Serializer = ServiceProvider.GetService <ISerializer>(); TypeFinder = ServiceProvider.GetService <ITypeFinder>(); SnapshotHandler = ServiceProvider.GetService <ISnapshotHandler <PrimaryKey, StateType> >(); if (SnapshotHandler == default) { throw new UnfindSnapshotHandlerException(GrainType); } ObserverUnit = ServiceProvider.GetService <IObserverUnitContainer>().GetUnit <PrimaryKey>(GrainType); ObserverEventHandlers = ObserverUnit.GetAllEventHandlers(); var configureBuilder = (IConfigureBuilder <PrimaryKey>)ServiceProvider.GetService(typeof(IConfigureBuilder <,>).MakeGenericType(typeof(PrimaryKey), GrainType)); var storageConfigTask = configureBuilder.GetConfig(ServiceProvider, GrainId); if (!storageConfigTask.IsCompletedSuccessfully) { await storageConfigTask; } var storageFactory = ServiceProvider.GetService(configureBuilder.StorageFactory) as IStorageFactory; //创建归档存储器 if (ArchiveOptions.On) { var archiveStorageTask = storageFactory.CreateArchiveStorage <PrimaryKey, StateType>(storageConfigTask.Result, GrainId); if (!archiveStorageTask.IsCompletedSuccessfully) { await archiveStorageTask; } ArchiveStorage = archiveStorageTask.Result; } //创建事件存储器 var eventStorageTask = storageFactory.CreateEventStorage(storageConfigTask.Result, GrainId); if (!eventStorageTask.IsCompletedSuccessfully) { await eventStorageTask; } EventStorage = eventStorageTask.Result; //创建状态存储器 var stateStorageTask = storageFactory.CreateSnapshotStorage <PrimaryKey, StateType>(storageConfigTask.Result, GrainId); if (!stateStorageTask.IsCompletedSuccessfully) { await stateStorageTask; } SnapshotStorage = stateStorageTask.Result; //创建事件发布器 var producerTask = ProducerContainer.GetProducer(GrainType); if (!producerTask.IsCompletedSuccessfully) { await producerTask; } EventBusProducer = producerTask.Result; }
public async Task FinishTransaction(long transactionId) { if (CurrentTransactionId == transactionId) { //如果副本快照没有更新,则更新副本集 foreach (var transport in WaitingForTransactionTransports) { var task = OnRaised(transport.FullyEvent, transport.BytesTransport); if (!task.IsCompletedSuccessfully) { await task; } } var onFinishTask = OnFinshTransaction(transactionId); if (!onFinishTask.IsCompletedSuccessfully) { await onFinishTask; } var saveSnapshotTask = SaveSnapshotAsync(); if (!saveSnapshotTask.IsCompletedSuccessfully) { await saveSnapshotTask; } var handlers = ObserverUnit.GetAllEventHandlers(); if (handlers.Count > 0) { try { foreach (var transport in WaitingForTransactionTransports) { await PublishToEventBus(transport.BytesTransport.GetBytes(), transport.HashKey); } } catch (Exception ex) { Logger.LogError(ex, ex.Message); } } WaitingForTransactionTransports.Clear(); RestoreTransactionTemporaryState(); TransactionSemaphore.Release(); } }
public async Task FinishTransaction(long transactionId) { if (CurrentTransactionId == transactionId) { //如果副本快照没有更新,则更新副本集 foreach (var transport in WaitingForTransactionTransports) { var task = OnRaiseSuccessed(transport.FullyEvent, transport.BytesTransport); if (!task.IsCompletedSuccessfully) { await task; } } var onFinishTask = OnFinshTransaction(transactionId); if (!onFinishTask.IsCompletedSuccessfully) { await onFinishTask; } var saveSnapshotTask = SaveSnapshotAsync(); if (!saveSnapshotTask.IsCompletedSuccessfully) { await saveSnapshotTask; } var handlers = ObserverUnit.GetAllEventHandlers(); if (handlers.Count > 0) { try { foreach (var transport in WaitingForTransactionTransports) { if (CoreOptions.PriorityAsyncEventBus) { try { var publishTask = EventBusProducer.Publish(transport.BytesTransport.GetBytes(), transport.HashKey); if (!publishTask.IsCompletedSuccessfully) { await publishTask; } } catch (Exception ex) { Logger.LogError(ex, ex.Message); //当消息队列出现问题的时候同步推送 await Task.WhenAll(handlers.Select(func => func(transport.BytesTransport.GetBytes()))); } } else { try { await Task.WhenAll(handlers.Select(func => func(transport.BytesTransport.GetBytes()))); } catch (Exception ex) { Logger.LogError(ex, ex.Message); //当消息队列出现问题的时候异步推送 var publishTask = EventBusProducer.Publish(transport.BytesTransport.GetBytes(), transport.HashKey); if (!publishTask.IsCompletedSuccessfully) { await publishTask; } } } } } catch (Exception ex) { Logger.LogError(ex, ex.Message); } } WaitingForTransactionTransports.Clear(); RestoreTransactionTemporaryState(); TransactionSemaphore.Release(); } }