internal async Task <ExecutionResult> ExecuteAsync(T input, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); _logger.RequestingLock(); await LockStrategy.RequestLockAsync(cancellationToken); _logger.Executing(); using var context = new ChainContext(Name, _serviceProvider, cancellationToken); try { context.EventBroker.Publish(new ChainExecutionStartedEvent(context)); var startTickCount = Environment.TickCount64; var result = await ExecuteRootConnector(input, context); var duration = TimeSpan.FromMilliseconds(Environment.TickCount64 - startTickCount); LogResult(result); if (result is { Status : ExecutionResultStatus.Faulted, Exception : {} }) { await context.EventBroker.PublishAsync(new ChainExceptionEvent(context, result.Exception)); } context.EventBroker.Publish(new ChainExecutionResultEvent(context, duration, result)); LockStrategy.ReleaseLock(); return(result); }
internal async Task <ExecutionResult> ExecuteAsync(T input, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); _logger.RequestingLock(); await LockStrategy.RequestLockAsync(cancellationToken); _logger.Executing(); using var context = new ChainContext(Name, _serviceProvider, cancellationToken); try { context.EventBroker.Publish(new ChainExecutionStartedEvent(context)); var startTickCount = Environment.TickCount64; await _root.ProcessAsync(input, context); var duration = TimeSpan.FromMilliseconds(Environment.TickCount64 - startTickCount); if (context.Result == ExecutionResult.Unknown) { context.SetResult(ExecutionResult.Completed); } else if (context.Exception is { } exception) { await context.EventBroker.PublishAsync(new ChainExceptionEvent(context, exception)); } context.EventBroker.Publish(new ChainExecutionResultEvent(context, duration, context.Result, context.ResultReason, context.Exception)); LockStrategy.ReleaseLock(); } catch (Exception e) { try { _logger.LogCritical(e, "Critical failure"); } finally { Environment.Exit(2013); } } return(context.Result); }
protected abstract ValueTask <TOutput> Invoke(TInput input, ChainContext context);
ValueTask <TOutput> ILink <TInput, TOutput> .Invoke(TInput input, ChainContext context) => Invoke(input, context);
protected abstract ValueTask <TOutput> ExecuteAsync(TInput input, ChainContext context);
ValueTask <TOutput> ILink <TInput, TOutput> .ExecuteAsync(TInput input, ChainContext context) => ExecuteAsync(input, context);