public async Task <bool> Handle(ConsumeMessageInstanceCommand request, CancellationToken cancellationToken)
        {
            var processInstance = await _processInstanceCommandRepository.Get(request.FlowNodeInstanceId, cancellationToken);

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

            processInstance.ConsumeMessage(new Domains.MessageToken
            {
                Id             = Guid.NewGuid().ToString(),
                Name           = request.Name,
                MessageContent = request.MessageContent == null ? string.Empty : request.MessageContent.ToString()
            });
            var isRestarted = await _processInstanceProcessor.Execute(processInstance, cancellationToken);

            if (isRestarted)
            {
                var evt = processInstance.Restart();
                await _processInstanceCommandRepository.Update(processInstance, cancellationToken);

                await _processInstanceCommandRepository.SaveChanges(cancellationToken);

                await _busControl.Publish(evt, cancellationToken);
            }

            await _processInstanceCommandRepository.Update(processInstance, cancellationToken);

            await _processInstanceCommandRepository.SaveChanges(cancellationToken);

            return(true);
        }
コード例 #2
0
        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);
            }
        }
        public async Task <bool> Handle(MakeStateTransitionCommand request, CancellationToken cancellationToken)
        {
            var processInstance = await _processInstanceCommandRepository.Get(request.FlowNodeInstanceId, cancellationToken);

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

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

            var content = request.Parameters == null ? string.Empty : request.Parameters.ToString();

            processInstance.ConsumeStateTransition(request.FlowNodeElementInstanceId, request.State, content);
            var isRestarted = await _processInstanceProcessor.Execute(processInstance, cancellationToken);

            if (isRestarted)
            {
                var evt = processInstance.Restart();
                await _busControl.Publish(evt, cancellationToken);
            }

            await _processInstanceCommandRepository.Update(processInstance, cancellationToken);

            await _processInstanceCommandRepository.SaveChanges(cancellationToken);

            return(true);
        }
        public async Task <bool> Handle(StartProcessInstanceCommand request, CancellationToken cancellationToken)
        {
            var processInstance = await _processInstanceCommandRepository.Get(request.ProcessInstanceId, cancellationToken);

            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);
            if (request.NewExecutionPath)
            {
                processInstance.NewExecutionPath();
            }

            var isRestarted = await _processInstanceProcessor.Execute(processInstance, cancellationToken);

            if (isRestarted)
            {
                var evt = processInstance.Restart();
                await _processInstanceCommandRepository.Update(processInstance, cancellationToken);

                await _processInstanceCommandRepository.SaveChanges(cancellationToken);

                await _busControl.Publish(evt, cancellationToken);
            }

            await _processInstanceCommandRepository.Update(processInstance, cancellationToken);

            await _processInstanceCommandRepository.SaveChanges(cancellationToken);

            return(true);
        }