public async Task <SearchResult <ProcessInstanceResult> > Handle(CreateProcessInstanceCommand request, CancellationToken cancellationToken)
        {
            var processFile = await _eventStoreRepository.GetLastAggregate <ProcessFileAggregate>(request.ProcessFileId, ProcessFileAggregate.GetStreamName(request.ProcessFileId));

            if (processFile == null || string.IsNullOrWhiteSpace(processFile.AggregateId))
            {
                _logger.LogError($"the process file '{request.ProcessFileId}' doesn't exist");
                throw new UnknownProcessFileException(string.Format(Global.UnknownProcessFile, request.ProcessFileId));
            }

            var processInstances = BPMNParser.BuildInstances(processFile.Payload, request.ProcessFileId);
            var result           = new List <ProcessInstanceResult>();

            foreach (var processInstance in processInstances)
            {
                var pi = ProcessInstanceAggregate.New(request.ProcessFileId,
                                                      processFile.Name,
                                                      processInstance.ElementDefs.ToList(),
                                                      processInstance.Interfaces.ToList(),
                                                      processInstance.Messages.ToList(),
                                                      processInstance.ItemDefs.ToList(),
                                                      processInstance.SequenceFlows.ToList());
                await _commitAggregateHelper.Commit(pi, pi.GetStreamName(), cancellationToken);

                result.Add(ProcessInstanceResult.ToDto(pi));
            }

            return(new SearchResult <ProcessInstanceResult>
            {
                Content = result
            });
        }
        public Task Add(ProcessInstanceAggregate processInstance, CancellationToken token)
        {
            _dbContext.ProcessInstances.Add(processInstance.ToModel());
            var ets = _dbContext.ChangeTracker.Entries <ProcessInstanceModel>();

            return(Task.CompletedTask);
        }
Beispiel #3
0
        public async Task Handle(ProcessInstanceCreatedEvent message, CancellationToken token)
        {
            var record = ProcessInstanceAggregate.New(new List <DomainEvent>
            {
                message
            });
            await _processInstanceCommandRepository.Add(record, token);

            await _processInstanceCommandRepository.SaveChanges(token);
        }
Beispiel #4
0
 public static ProcessInstanceResult ToDto(ProcessInstanceAggregate processInstance)
 {
     return(new ProcessInstanceResult
     {
         Id = processInstance.AggregateId,
         Status = Enum.GetName(typeof(ProcessInstanceStatus), processInstance.Status),
         ProcessFileId = processInstance.ProcessFileId,
         ProcessFileName = processInstance.ProcessFileName,
         CreateDateTime = processInstance.CreateDateTime,
         UpdateDateTime = processInstance.UpdateDateTime,
         ExecutionPaths = processInstance.ExecutionPathLst.Select(_ => ExecutionPathResult.ToDto(_, processInstance.ElementInstances.ToList())).ToList()
     });
 }
 public async Task Execute(ProcessInstanceAggregate processInstance, CancellationToken token)
 {
     foreach (var executionPath in processInstance.ExecutionPathLst)
     {
         var activePointers = executionPath.Pointers.Where(_ => _.IsActive).ToList();
         foreach (var activePointer in activePointers)
         {
             var executionContext = new BPMNExecutionContext
             {
                 Instance = processInstance,
                 Path     = executionPath,
                 Pointer  = activePointer
             };
             await Execute(executionContext, token);
         }
     }
 }
Beispiel #6
0
 public static ProcessInstanceModel ToModel(this ProcessInstanceAggregate processInstance)
 {
     return(new ProcessInstanceModel
     {
         AggregateId = processInstance.AggregateId,
         CreateDateTime = processInstance.CreateDateTime,
         ProcessFileName = processInstance.ProcessFileName,
         Version = processInstance.Version,
         Status = (int)processInstance.Status,
         UpdateDateTime = processInstance.UpdateDateTime,
         ElementInstances = processInstance.ElementInstances.Select(_ => _.ToModel()).ToList(),
         Interfaces = processInstance.Interfaces.Select(_ => _.ToModel()).ToList(),
         StateTransitions = processInstance.StateTransitions.Select(_ => _.ToModel()).ToList(),
         ExecutionPathLst = processInstance.ExecutionPathLst.Select(_ => _.ToModel()).ToList(),
         ElementDefs = processInstance.ElementDefs.Select(_ => _.ToModel()).ToList(),
         ItemDefs = processInstance.ItemDefs.Select(_ => _.ToModel()).ToList(),
         Messages = processInstance.Messages.Select(_ => _.ToModel()).ToList(),
         SequenceFlows = processInstance.SequenceFlows.Select(_ => _.ToModel()).ToList(),
         ProcessFileId = processInstance.ProcessFileId,
     });
 }
Beispiel #7
0
        public async Task <bool> Execute(ProcessInstanceAggregate processInstance, CancellationToken token)
        {
            var isRestarted = false;

            foreach (var executionPath in processInstance.ExecutionPathLst)
            {
                var activePointers = executionPath.Pointers.Where(_ => _.IsActive).ToList();
                foreach (var activePointer in activePointers)
                {
                    var executionContext = new BPMNExecutionContext
                    {
                        Instance = processInstance,
                        Path     = executionPath,
                        Pointer  = activePointer
                    };
                    var secondResult = await Execute(executionContext, token);

                    isRestarted = secondResult || isRestarted;
                }
            }

            return(isRestarted);
        }
Beispiel #8
0
        public ProcessInstanceAggregate Build()
        {
            var elts       = new List <BaseFlowNode>();
            var interfaces = new List <BPMNInterface>();

            foreach (var builder in Builders)
            {
                elts.Add(builder.Build());
            }

            foreach (var gateway in Gateways)
            {
                elts.Add(gateway);
            }

            foreach (var interfaceBuilder in InterfaceBuilders)
            {
                interfaces.Add(interfaceBuilder.Build());
            }

            var result = ProcessInstanceAggregate.New(ProcessFileId, "", elts, interfaces, Messages, ItemDefs, SequenceFlows);

            return(result);
        }
 public Task Update(ProcessInstanceAggregate processInstance, CancellationToken token)
 {
     _dbContext.ProcessInstances.Update(processInstance);
     return(Task.CompletedTask);
 }
        protected override async Task ProcessMessage(ProcessInstanceNotification notification, CancellationToken cancellationToken)
        {
            string lockName = $"processinstances:{notification.Id}";

            if (!await _distributedLock.TryAcquireLock(lockName, cancellationToken))
            {
                return;
            }

            var processInstance = await _eventStoreRepository.GetLastAggregate <ProcessInstanceAggregate>(notification.ProcessInstanceId, ProcessInstanceAggregate.GetStreamName(notification.ProcessInstanceId));

            try
            {
                if (processInstance == null || string.IsNullOrWhiteSpace(processInstance.AggregateId))
                {
                    throw new InvalidOperationException($"process instance '{notification.ProcessInstanceId}' doesn't exist");
                }

                if (notification.IsNewInstance)
                {
                    processInstance.NewExecutionPath();
                }

                await _processInstanceProcessor.Execute(processInstance, cancellationToken);

                await _commitAggregateHelper.Commit(processInstance, processInstance.GetStreamName(), cancellationToken);
            }
            finally
            {
                await _distributedLock.ReleaseLock(lockName, cancellationToken);
            }
        }
Beispiel #11
0
        public async Task <bool> Handle(StartProcessInstanceCommand request, CancellationToken cancellationToken)
        {
            var processInstance = await _eventStoreRepository.GetLastAggregate <ProcessInstanceAggregate>(request.ProcessInstanceId, ProcessInstanceAggregate.GetStreamName(request.ProcessInstanceId));

            if (request == null || string.IsNullOrWhiteSpace(processInstance.AggregateId))
            {
                _logger.LogError($"unknown process instance '{request.ProcessInstanceId}'");
                throw new UnknownFlowInstanceException(string.Format(Global.UnknownProcessInstance, request.ProcessInstanceId));
            }

            processInstance.Start(request.NameIdentifier);
            await _commitAggregateHelper.Commit(processInstance, processInstance.GetStreamName(), cancellationToken);

            await _messageBroker.QueueProcessInstance(request.ProcessInstanceId, true, cancellationToken);

            return(true);
        }
Beispiel #12
0
        protected override async Task ProcessMessage(StateTransitionNotification message, CancellationToken cancellationToken)
        {
            string lockName = $"statetransitions:{message.Id}";

            if (!await _distributedLock.TryAcquireLock(lockName, cancellationToken))
            {
                return;
            }

            var processInstance = await _eventStoreRepository.GetLastAggregate <ProcessInstanceAggregate>(message.ProcessInstanceId, ProcessInstanceAggregate.GetStreamName(message.ProcessInstanceId));

            try
            {
                if (processInstance == null || string.IsNullOrWhiteSpace(processInstance.AggregateId))
                {
                    throw new InvalidOperationException($"process instance '{message.ProcessInstanceId}' doesn't exist");
                }

                processInstance.ConsumeStateTransition(message);
                await _commitAggregateHelper.Commit(processInstance, processInstance.GetStreamName(), cancellationToken);

                await MessageBroker.QueueProcessInstance(processInstance.AggregateId, false, cancellationToken);

                _logger.LogInformation($"Make transition '{message.State}' on the user task instance '{message.FlowNodeInstanceId}'");
            }
            finally
            {
                await _distributedLock.ReleaseLock(lockName, cancellationToken);
            }
        }
 public Task RegisterProcessInstance(ProcessInstanceAggregate processInstance, CancellationToken token)
 {
     return(_processJobServer.RegisterProcessInstance(processInstance, token));
 }
        public async Task <bool> Handle(MakeStateTransitionCommand request, CancellationToken cancellationToken)
        {
            var processInstance = await _eventStoreRepository.GetLastAggregate <ProcessInstanceAggregate>(request.FlowNodeInstanceId, ProcessInstanceAggregate.GetStreamName(request.FlowNodeInstanceId));

            if (processInstance == null)
            {
                _logger.LogError($"unknown process instance '{request.FlowNodeInstanceId}'");
                throw new UnknownFlowInstanceException(string.Format(Global.UnknownProcessInstance, request.FlowNodeInstanceId));
            }

            if (!processInstance.ElementInstances.Any(_ => _.Id == request.FlowNodeElementInstanceId))
            {
                _logger.LogError($"unknown process element instance '{request.FlowNodeElementInstanceId}'");
                throw new UnknownFlowNodeElementInstanceException(string.Format(Global.UnknownProcessElementInstance, request.FlowNodeElementInstanceId));
            }

            await _messageBroker.QueueStateTransition(request.FlowNodeInstanceId, request.FlowNodeElementInstanceId, request.State, request.Parameters, cancellationToken);

            return(true);
        }
 public async Task RegisterProcessInstance(ProcessInstanceAggregate processInstance, CancellationToken token)
 {
     await _commitAggregateHelper.Commit(processInstance, processInstance.GetStreamName(), token);
 }
Beispiel #16
0
        protected override async Task ProcessMessage(MessageNotification notification, CancellationToken cancellationToken)
        {
            string lockName = $"messages:{notification.Id}";

            if (!await _distributedLock.TryAcquireLock(lockName, cancellationToken))
            {
                return;
            }

            var processInstance = await _eventStoreRepository.GetLastAggregate <ProcessInstanceAggregate>(notification.ProcessInstanceId, ProcessInstanceAggregate.GetStreamName(notification.ProcessInstanceId));

            try
            {
                if (processInstance == null || string.IsNullOrWhiteSpace(processInstance.AggregateId))
                {
                    throw new InvalidOperationException($"process instance '{notification.ProcessInstanceId}' doesn't exist");
                }

                processInstance.ConsumeMessage(new MessageToken
                {
                    Name           = notification.MessageName,
                    MessageContent = notification.Content
                });
                await _commitAggregateHelper.Commit(processInstance, processInstance.GetStreamName(), cancellationToken);

                await MessageBroker.QueueProcessInstance(processInstance.AggregateId, false, cancellationToken);
            }
            finally
            {
                await _distributedLock.ReleaseLock(lockName, cancellationToken);
            }
        }
Beispiel #17
0
 public async Task RegisterProcessInstance(ProcessInstanceAggregate processInstance, CancellationToken token)
 {
     await _processInstanceCommandRepository.Add(processInstance, token);
 }
Beispiel #18
0
 public override bool IsSatisfied(ProcessInstanceAggregate processInstance, MessageToken token)
 {
     return(processInstance.IsMessageCorrect(MessageRef, token));
 }
        public async Task Update(ProcessInstanceAggregate processInstance, CancellationToken token)
        {
            var result = await _dbContext.ProcessInstances
                         .Include(_ => _.ItemDefs)
                         .Include(_ => _.Interfaces).ThenInclude(_ => _.Operations)
                         .Include(_ => _.Messages)
                         .Include(_ => _.ElementDefs)
                         .Include(_ => _.SequenceFlows)
                         .Include(_ => _.ExecutionPathLst).ThenInclude(_ => _.Pointers).ThenInclude(_ => _.Tokens)
                         .Include(_ => _.StateTransitions)
                         .Include(_ => _.ElementInstances).ThenInclude(_ => _.ActivityStates)
                         .FirstOrDefaultAsync(_ => _.AggregateId == processInstance.AggregateId, token);

            var rec = processInstance.ToModel();

            result.Status         = rec.Status;
            result.NameIdentifier = rec.NameIdentifier;
            result.Version        = rec.Version;
            result.UpdateDateTime = rec.UpdateDateTime;
            result.ItemDefs.Clear();
            result.Interfaces.Clear();
            result.Messages.Clear();
            result.ElementDefs.Clear();
            result.SequenceFlows.Clear();
            result.ElementInstances.Clear();
            result.ExecutionPathLst.Clear();
            result.StateTransitions.Clear();
            foreach (var itemDef in rec.ItemDefs)
            {
                result.ItemDefs.Add(itemDef);
            }

            foreach (var inter in rec.Interfaces)
            {
                result.Interfaces.Add(inter);
            }

            foreach (var msg in rec.Messages)
            {
                result.Messages.Add(msg);
            }

            foreach (var eltDef in rec.ElementDefs)
            {
                result.ElementDefs.Add(eltDef);
            }

            foreach (var sequenceFlow in rec.SequenceFlows)
            {
                result.SequenceFlows.Add(sequenceFlow);
            }

            foreach (var eltInstance in rec.ElementInstances)
            {
                result.ElementInstances.Add(eltInstance);
            }

            foreach (var executionPath in rec.ExecutionPathLst)
            {
                result.ExecutionPathLst.Add(executionPath);
            }

            foreach (var stateTransition in rec.StateTransitions)
            {
                result.StateTransitions.Add(stateTransition);
            }
        }