Esempio n. 1
0
        private IReadWritableGroupEntity CreateGroupEntity(int key, List <JobCriteria> criteria, bool isManual,
                                                           string triggeredBy, List <int> processKeys)
        {
            var serializer = _serializersFactory.GetSerializer <JobCriteria>();
            var crit       = serializer.SerializeToString(criteria);

            IReadWritableGroupEntity entity = _entityFactory.CreateGroupEntity();

            //IGroupEntity entity =  _entityFactory.CreateGroupEntity(key, crit, isManual, false, triggeredBy, TaskCompletionStatus.Pending.Name);
            IWritableGroupEntity entityW = entity;

            entityW.Criteria       = crit;
            entityW.GroupKey       = key;
            entityW.IsManual       = isManual;
            entityW.IsResubmission = false;
            entityW.SubmittedBy    = triggeredBy;
            entityW.State          = CompletionStatus.Pending.Name;
            if (processKeys != null)
            {
                entityW.Payload = serializer.SerializeToString(processKeys);
            }
            //IGroupEntity g = entity;

            var entity2 = _stateManager.CreateGroupEntity(entity);

            return(entity2);
        }
Esempio n. 2
0
 public JobScheduler(ISerializersFactory factory, IPubSubFactory pubSubFactory, IBatchLoggerFactory loggerFactory)
 {
     SystemLogger = loggerFactory.GetSystemLogger();
     _publisher   = pubSubFactory.GetPublisher(CancellationToken.None, SystemLogger, nameof(IWatchDogMessage));
     //_ser = SerializersFactory.Instance.GetSerializer<List<JobCriteria>>();
     //JsonSerializer serializer=new JsonSerializer();
     _ser = factory.GetSerializer(typeof(JobCriteria));
 }
Esempio n. 3
0
        public ISerializer GetSerializer(ITask taskHandler)
        {
            return(_taskSerializers.GetOrAdd(taskHandler.ProcessKey, key =>
            {
                var serializer = taskHandler.Serializer;

                if (serializer == null)
                {
                    Type[] interfaces = taskHandler.GetType().GetInterfaces().Where(intrface => intrface.IsGenericType)
                                        .ToArray();

                    var serializerType = interfaces.First(x => x.GetGenericTypeDefinition() == typeof(ITask <,>))
                                         .GetGenericArguments().First(a => !typeof(ITaskContext).IsAssignableFrom(a));
                    serializer = _serializersFactory.GetSerializer(serializerType);
                }

                return serializer ?? _serializersFactory.GetSerializer(typeof(object));
            }));
        }
Esempio n. 4
0
        internal SubmittedGroup CreateProcesses(IReadWritableGroupEntity @group, List <int> processIds,
                                                List <JobCriteria> messageCriteria)
        {
            var groupLogger = _loggerFactory.GetGroupLogger(group.Id, group.GroupKey);

            groupLogger.Trace("Starting group");


            if (processIds == null || processIds.Count == 0)
            {
                _logger.Error("No process found for group");
                StopGroup(@group, "No process found for group");
                return(null);
            }

            var serializer = _serializersFactory.GetSerializer <JobCriteria>();

            GroupStartContext context = new GroupStartContext(group, groupLogger, messageCriteria, Bus);

            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(null);
            }

            //todo get group processes and add to queue
            List <(JobCriteria Criteria, IReadWritableProcessState ProcessState)> process2Submit = new List <(JobCriteria Criteria, IReadWritableProcessState ProcessState)>(); // List<IReadWritableProcessState>();

            List <IReadWritableProcessState> processList = new List <IReadWritableProcessState>();

            foreach (var processId in processIds)
            {
                var process = _entityFactory.CreateProcessEntity();
                process.ProcessId = processId;
                //process
                //IReadWritableProcessState process = erf wer GetKeyProcesses(processKey);
                //IWritableProcessState writableProcess = process;
                process.GroupId = group.Id;

                //process.CorrelationId=Guid.NewGuid();
                processList.Add(process);
            }


            if (processList.Count == 0)
            {
                _logger.Error("No process found for group");
                StopGroup(group, "No process found for group");
                return(null);
            }

            //if (messageCriteria.Count == 1)
            //{
            //    var cta = messageCriteria[0];
            //    process2submit.AddRange(processList.Select(s =>
            //    {
            //        ((IWritableProcessState)s).Criteria = serializer.SerializeToString(cta);
            //        return s;
            //    }));
            //}
            //else
            {
                int groupSeqId = 0;
                foreach (var criteria in messageCriteria)
                {
                    groupSeqId++;
                    foreach (var process in processList)
                    {
                        var p = process.Clone(_entityFactory);
                        p.Criteria          = serializer.SerializeToString(criteria);
                        p.CorrelationId     = Guid.NewGuid();
                        process.CompanyId   = criteria.CompanyId;
                        process.BranchId    = criteria.BranchId;
                        process.SubTenantId = criteria.SubTenantId;
                        p.ProcessingDate    = criteria.ProcessingDate;
                        p.Status            = CompletionStatus.Pending;
                        p.Result            = ResultStatus.Empty;
                        p.GroupSeqId        = groupSeqId;
                        //p.Tag = criteria.Tag; //todo
                        process2Submit.Add((criteria, p));
                    }
                }
            }


            _logger.Trace($"Submitting processes {process2Submit.Count}");
            SubmitProcesses(process2Submit, group);
            _logger.Trace($"Submission complete of {process2Submit.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(null);
            }

            //var nextProcesses = GetNextProcesses(null);

            //nextProcesses.ForEach(p =>
            //{
            //    var volumeMessage = new ProcessExecutionContext(BatchLoggerFactory.GetProcessLogger(p.Id, p.ProcessKey), p);
            //    Bus.Instance.HandleVolumeRequest(volumeMessage);
            //});

            SubmittedGroup gGroup = new SubmittedGroup(group, process2Submit.Select(s => s.ProcessState).ToList());

            return(gGroup);
        }
Esempio n. 5
0
        public void Handle <T>(IEnumerable <T> volume, IProcessExecutionContextWithVolume processContext, CancellationToken token)
        {
            if (volume == null)
            {
                processContext.Logger.Info("No volume returned");
                return;
            }

            bool hasVolume    = false;
            var  serializer   = _serializersFactory.GetSerializer <T>();
            int  currentCount = 0;
            int  batchSize    = 100;


            try
            {
                Bus.HandleDbCommand(new DbAction(DbActions.Transaction, () => //create transaction in Db Bus pipeline
                {
                    var volumeDeletedCount = ExecuteNonQuery(Constant.SQLDeleteProcessVolume, processContext.ProcessState.Id);
                    if (volumeDeletedCount > 0)
                    {
                        processContext.Logger.Warn($"Existing volume {volumeDeletedCount} deleting");
                    }
                }));

                //using (var unitOfWork = ) //IsolationLevel.Snapshot //todo check isolation level with db team, is it enabled by default
                {
                    foreach (var v in volume)
                    {
                        var payLoad = serializer.SerializeToString(v);
                        IReadWritableTaskState state = CreateNew();

                        state.Payload      = payLoad;
                        state.ProcessId    = processContext.ProcessState.Id;
                        state.CurrentState = ResultStatus.Empty.Name;

                        currentCount++;
                        if (currentCount >= batchSize)
                        {
                            token.ThrowIfCancellationRequested();

                            hasVolume = true;
                            //Persist();
                            currentCount = 0;
                            //Clear();//remove persisted items
                        }
                    }
                    //if (Entity.Count>0)
                    {
                        token.ThrowIfCancellationRequested();
                        hasVolume = true;
                        // Persist();
                    }

                    //Commit();
                }
            }
            finally
            {
                //dispose / rollback
            }

            if (hasVolume)
            {
                processContext.SetVolumeGenerated();
            }
        }