async Task SendToInstance <T>(SagaQueryConsumeContext <TSaga, T> context, ISagaPolicy <TSaga, T> policy, SagaInstance <TSaga> saga, IPipe <SagaConsumeContext <TSaga, T> > next) where T : class { await saga.MarkInUse(context.CancellationToken).ConfigureAwait(false); try { if (saga.IsRemoved) { return; } SagaConsumeContext <TSaga, T> sagaConsumeContext = new InMemorySagaConsumeContext <TSaga, T>(context, saga.Instance, () => Remove(saga, context.CancellationToken)); sagaConsumeContext.LogUsed(); await policy.Existing(sagaConsumeContext, next).ConfigureAwait(false); } finally { saga.Release(); } }
async Task SendToInstance <T>(SagaQueryConsumeContext <TSaga, T> context, ISagaPolicy <TSaga, T> policy, SagaInstance <TSaga> saga, IPipe <SagaConsumeContext <TSaga, T> > next) where T : class { await saga.MarkInUse(context.CancellationToken).ConfigureAwait(false); try { if (saga.IsRemoved) { return; } if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Used {2}", TypeMetadataCache <TSaga> .ShortName, saga.Instance.CorrelationId, TypeMetadataCache <T> .ShortName); } SagaConsumeContext <TSaga, T> sagaConsumeContext = new InMemorySagaConsumeContext <TSaga, T>(context, saga.Instance, () => Remove(saga, context.CancellationToken)); await policy.Existing(sagaConsumeContext, next).ConfigureAwait(false); } finally { saga.Release(); } }
public async Task Send(SagaConsumeContext <TSaga, TMessage> context) { var instance = new SagaInstance <TSaga>(context.Saga); await instance.MarkInUse(context.CancellationToken).ConfigureAwait(false); try { var proxy = new InMemorySagaConsumeContext <TSaga, TMessage>(context, context.Saga, () => RemoveNewSaga(instance, context.CancellationToken)); if (_withinLock) { _repository.AddWithinLock(instance); } else { await _repository.Add(instance, context.CancellationToken).ConfigureAwait(false); } if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Added {2}", TypeMetadataCache <TSaga> .ShortName, context.Saga.CorrelationId, TypeMetadataCache <TMessage> .ShortName); } try { await _next.Send(proxy).ConfigureAwait(false); if (proxy.IsCompleted) { if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Removed {2}", TypeMetadataCache <TSaga> .ShortName, context.Saga.CorrelationId, TypeMetadataCache <TMessage> .ShortName); } await RemoveNewSaga(instance, context.CancellationToken).ConfigureAwait(false); } } catch (Exception) { if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Removed(Fault) {2}", TypeMetadataCache <TSaga> .ShortName, context.Saga.CorrelationId, TypeMetadataCache <TMessage> .ShortName); } await RemoveNewSaga(instance, context.CancellationToken).ConfigureAwait(false); throw; } } finally { instance.Release(); } }
async Task ISagaRepository <TSaga> .Send <T>(ConsumeContext <T> context, ISagaPolicy <TSaga, T> policy, IPipe <SagaConsumeContext <TSaga, T> > next) { if (!context.CorrelationId.HasValue) { throw new SagaException("The CorrelationId was not specified", typeof(TSaga), typeof(T)); } var sagaId = context.CorrelationId.Value; var needToLeaveSagas = true; await _sagas.MarkInUse(context.CancellationToken).ConfigureAwait(false); try { SagaInstance <TSaga> saga = _sagas[sagaId]; if (saga == null) { var missingSagaPipe = new MissingPipe <T>(this, next, true); await policy.Missing(context, missingSagaPipe).ConfigureAwait(false); _sagas.Release(); needToLeaveSagas = false; } else { await saga.MarkInUse(context.CancellationToken).ConfigureAwait(false); try { _sagas.Release(); needToLeaveSagas = false; if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Used {2}", TypeMetadataCache <TSaga> .ShortName, sagaId, TypeMetadataCache <T> .ShortName); } SagaConsumeContext <TSaga, T> sagaConsumeContext = new InMemorySagaConsumeContext <TSaga, T>(context, saga.Instance, () => Remove(saga, context.CancellationToken)); await policy.Existing(sagaConsumeContext, next).ConfigureAwait(false); } finally { saga.Release(); } } } finally { if (needToLeaveSagas) { _sagas.Release(); } } }
public async Task Send(SagaConsumeContext <TSaga, TMessage> context) { var instance = new SagaInstance <TSaga>(context.Saga); await instance.MarkInUse(context.CancellationToken).ConfigureAwait(false); var activity = LogContext.IfEnabled(OperationName.Saga.Add)?.StartActivity(new { context.Saga.CorrelationId }); try { var sagaConsumeContext = new InMemorySagaConsumeContext <TSaga, TMessage>(context, context.Saga, () => RemoveNewSaga(instance, context.CancellationToken)); if (_withinLock) { _repository.AddWithinLock(instance); } else { await _repository.Add(instance, context.CancellationToken).ConfigureAwait(false); } sagaConsumeContext.LogAdded(); try { await _next.Send(sagaConsumeContext).ConfigureAwait(false); if (sagaConsumeContext.IsCompleted) { await RemoveNewSaga(instance, context.CancellationToken).ConfigureAwait(false); sagaConsumeContext.LogRemoved(); } } catch (Exception exception) { await RemoveNewSaga(instance, context.CancellationToken).ConfigureAwait(false); sagaConsumeContext.LogRemoved(exception); throw; } } finally { instance.Release(); activity?.Stop(); } }
public async Task Send(SagaConsumeContext <TSaga, TMessage> context) { if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Added {2}", TypeMetadataCache <TSaga> .ShortName, context.Saga.CorrelationId, TypeMetadataCache <TMessage> .ShortName); } var proxy = new InMemorySagaConsumeContext <TSaga, TMessage>(_repository, context, context.Saga); await _repository.Add(context.Saga, context.CancellationToken); await _next.Send(proxy); if (proxy.IsCompleted) { await _repository.Remove(proxy.Saga, context.CancellationToken); } }
public async Task Send(SagaConsumeContext <TSaga, TMessage> context) { var proxy = new InMemorySagaConsumeContext <TSaga, TMessage>(_repository, context, context.Saga, () => RemoveNewSaga(context.Saga, context.CancellationToken)); if (_withinLock) { _repository.AddWithinLock(context.Saga); } else { await _repository.Add(context.Saga, context.CancellationToken); } if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Added {2}", TypeMetadataCache <TSaga> .ShortName, context.Saga.CorrelationId, TypeMetadataCache <TMessage> .ShortName); } try { await _next.Send(proxy); if (proxy.IsCompleted) { await RemoveNewSaga(proxy.Saga, context.CancellationToken); } } catch (Exception) { if (_log.IsDebugEnabled) { _log.DebugFormat("SAGA:{0}:{1} Removed(Fault) {2}", TypeMetadataCache <TSaga> .ShortName, context.Saga.CorrelationId, TypeMetadataCache <TMessage> .ShortName); } await RemoveNewSaga(proxy.Saga, context.CancellationToken); throw; } }
async Task ISagaRepository <TSaga> .Send <T>(ConsumeContext <T> context, ISagaPolicy <TSaga, T> policy, IPipe <SagaConsumeContext <TSaga, T> > next) { if (!context.CorrelationId.HasValue) { throw new SagaException("The CorrelationId was not specified", typeof(TSaga), typeof(T)); } var sagaId = context.CorrelationId.Value; await _sagas.MarkInUse(context.CancellationToken).ConfigureAwait(false); var needToLeaveSagas = true; try { SagaInstance <TSaga> saga = _sagas[sagaId]; if (saga != null) { await saga.MarkInUse(context.CancellationToken).ConfigureAwait(false); try { _sagas.Release(); needToLeaveSagas = false; if (saga.IsRemoved) { saga.Release(); saga = null; } else { SagaConsumeContext <TSaga, T> sagaConsumeContext = new InMemorySagaConsumeContext <TSaga, T>(context, saga.Instance, () => Remove(saga, context.CancellationToken)); sagaConsumeContext.LogUsed(); await policy.Existing(sagaConsumeContext, next).ConfigureAwait(false); } } finally { saga?.Release(); } } if (saga == null) { var missingSagaPipe = new MissingPipe <T>(this, next, true); await policy.Missing(context, missingSagaPipe).ConfigureAwait(false); _sagas.Release(); needToLeaveSagas = false; } } finally { if (needToLeaveSagas) { _sagas.Release(); } } }