public static void MarkAsError(this ProcessExecutionContext context, IStateManager stateManager, string errorMessage, IProcessRepository registeredProcesses, IBatchEngineSubscribers batchEngineSubscribers, IFrameworkLogger fLogger) { context.Logger.Error(errorMessage); context.WritableProcessState.Status = CompletionStatus.Finished; context.WritableProcessState.Result = ResultStatus.Error; context.WritableProcessState.CompleteTime = DateTime.UtcNow; stateManager.SaveProcess(context.WritableProcessState); context.WritableProcessState.TriggerProcessEvents(registeredProcesses, context, true, context.ProcessState.IsStopped, batchEngineSubscribers, fLogger, errorMessage); }
public IProcessExecutionContext GetProcessExecutionContext(long processId) { var context = _processExecutionContexts.GetOrAdd(processId, id => { var process = _stateManager.GetProcessById(processId); if (process == null) { throw new FrameworkException($"BatchProcess not found for process id {processId}"); } var config = GetProcessConfiguration(process.ProcessId); var groupEntity = _stateManager.GetGroupEntity(process.GroupId); var executionContext = new ProcessExecutionContext(_batchLoggerFactory.GetProcessLogger(processId, process.ProcessId, process.CorrelationId), process, config, _storage, groupEntity); return(executionContext); }); return(context); }
private void SubmitVolumeRequest(IEnumerable <IReadWritableProcessState> processes, IReadWritableGroupEntity groupDetailsGroupEntity) { try { foreach (var p in processes) { var volumeMessage = new ProcessExecutionContext(_loggerFactory.GetProcessLogger(p.Id, p.ProcessId, p.CorrelationId), p, _cacheAside.GetProcessConfiguration(p.ProcessId), _storage, groupDetailsGroupEntity); //Bus.HandleVolumeRequest(volumeMessage); _volumePipeline.Invoke(volumeMessage); } } catch (Exception e) { Logger.Error($"Error submitting processes for volume generation. Message {e.Message}", e); //process should be marked as error in volume generation, hence no further processing _groupsHandler.StopGroup(groupDetailsGroupEntity, $"Error generating volume. Message {e.Message}"); } }
private void StartGroup(IGroupEntity group) { var groupLogger = LoggerFactory.GetGroupLogger(group.Id, group.GroupKey); groupLogger.Trace("Starting group"); GroupStartContext context = new GroupStartContext(group, groupLogger); var groupSubscribers = _batchEngineSubscribers.GetGroupSubscribers().ToList(); foreach (var groupSubscriber in groupSubscribers) { if (groupSubscriber.GroupKey != group.GroupKey) { continue; } context.CurrentSubscriber = groupSubscriber; Robustness.Instance.SafeCall(() => { groupSubscriber.OnGroupStarting(context); }, groupLogger); context.CurrentSubscriber = null; } if (context.StopFlag) { groupLogger.Info("Group stopped by subscriber"); StopGroup(group, "Group stopped by subscriber"); return; } //todo get group processes and add to queue var groupProcesses = GetGroupProcesses(group.GroupKey); if (groupProcesses.Count == 0) { _logger.Error("No process found for group"); StopGroup(group, "No process found for group"); return; } _logger.Trace($"Submitting processes {groupProcesses.Count}"); SubmitProcesses(groupProcesses, group); _logger.Trace($"Submission complete of {groupProcesses.Count} processes"); foreach (var groupSubscriber in groupSubscribers) { if (groupSubscriber.GroupKey != group.GroupKey) { continue; } context.CurrentSubscriber = groupSubscriber; Robustness.Instance.SafeCall(() => { groupSubscriber.OnGroupSubmitted(context); }, groupLogger); context.CurrentSubscriber = null; } if (context.StopFlag) { groupLogger.Info("Group stopped by subscriber"); StopGroup(group, "Group stopped by subscriber"); return; } var nextProcesses = GetNextProcesses(null); nextProcesses.ForEach(p => { var volumeMessage = new ProcessExecutionContext(LoggerFactory.GetProcessLogger(p.Id, p.ProcessKey), p); Bus.Instance.HandleVolumeRequest(volumeMessage); }); }