예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
 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}");
     }
 }
예제 #4
0
        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);
            });
        }