Ejemplo n.º 1
0
        public Task Persist(SagaContext saga, ISagaMessage sagaMessage, IMessageHandlerContext context)
        {
            if (saga is null)
            {
                throw new ArgumentNullException(nameof(saga), $"A non-null saga is required for persistance.");
            }

            saga.PersistedAtUtc     = DateTime.UtcNow;
            _sagaCache[saga.SagaId] = saga;

            RemoveExpiredMessagesFromSagaPersistance();

            _logger.LogDebug($"Saga persisted to in-memory storage with id '{saga.SagaId}' and status '{saga.Status}'");
            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        public async Task InvokeStep <TMessage>(Func <TMessage, IMessageHandlerContext, Task> sagaStepHandler, ISagaMessage message, IMessageBrokerContext context)
            where TMessage : IMessage
        {
            SagaContext saga = await _sagaInitializer.Initialize(message, context).ConfigureAwait(false);

            if (!(sagaStepHandler is null))
            {
                await sagaStepHandler((TMessage)message, context).ConfigureAwait(false);
            }

            saga.InProgress();

            context.BrokeredMessage.WithSagaStatus(saga.Status.Status);

            await _sagaPersister.Persist(saga, message, context).ConfigureAwait(false);
        }
Ejemplo n.º 3
0
        public async Task Start <TSagaMessage>(TSagaMessage message, IMessageHandlerContext context)
            where TSagaMessage : ISagaMessage
        {
            SagaContext saga = await _sagaInitializer.Initialize(message, context).ConfigureAwait(false);

            var options = _sagaOptionsProvider.GetOptionsFor(message);

            var sendOptions = new SendOptions()
                              .WithSubject(options.Description)
                              .WithTimeToLiveInMinutes(options.MaxSagaDurationInMinutes)
                              .WithTransactionMode(options.TransactionMode)
                              .WithSagaId(saga.SagaId)
                              .WithSagaStatus(saga.Status.Status);

            await _brokeredMessageDispatcher.Send(message, options : sendOptions).ConfigureAwait(false);

            saga.InProgress();

            await _sagaPersister.Persist(saga, message, context).ConfigureAwait(false);
        }