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