Exemple #1
0
        public async Task <ApiResponse <PatchResult> > Patch(
            Guid id, [FromBody] StateMachineInstancePatchDto dto)
        {
            var patchResult = await _stateMachineInstanceService.Patch(id, dto);

            var result = new PatchResult(patchResult.Code == 200 ? 1 : 0);

            return(ApiResponse.Custom(Response, patchResult.Code, patchResult.Message, result));
        }
        public async Task <StateMachineInstancePatchResultDto> Patch(Guid id, StateMachineInstancePatchDto dto)
        {
            // 更新阶段, 参数和并发键
            StateMachineInstanceEntity stateMachineInstanceEntity = null;
            StateMachineEntity         stateMachineEntity         = null;

            for (int from = 0; from <= ConcurrencyErrorMaxRetryTimes; ++from)
            {
                stateMachineInstanceEntity = await _repository.QueryAsync(q =>
                                                                          q.FirstOrDefaultAsyncTestable(x => x.Id == id));

                if (stateMachineInstanceEntity == null)
                {
                    return(StateMachineInstancePatchResultDto.NotFound("state machine instance not found"));
                }
                stateMachineEntity = await _stateMachineRepository.QueryNoTrackingAsync(q =>
                                                                                        q.FirstOrDefaultAsyncTestable(x => x.Name == stateMachineInstanceEntity.Name));

                if (stateMachineEntity == null)
                {
                    return(StateMachineInstancePatchResultDto.NotFound("state machine not found"));
                }
                stateMachineInstanceEntity.Status                = StateMachineStatus.Running;
                stateMachineInstanceEntity.Stage                 = dto.Stage ?? StateMachineBase.InitialStage;
                stateMachineInstanceEntity.ExecutionKey          = PrimaryKeyUtils.Generate <Guid>().ToString();
                stateMachineInstanceEntity.FromManagementService = _configuration.Name;
                stateMachineInstanceEntity.StartTime             = DateTime.UtcNow; // 柚子大姐要求
                if (dto.Parameters != null)
                {
                    var parameters = stateMachineInstanceEntity.Parameters;
                    foreach (var pair in dto.Parameters)
                    {
                        parameters[pair.Key] = pair.Value;
                    }
                    stateMachineInstanceEntity.Parameters = parameters;
                }
                try
                {
                    await _repository.SaveChangesAsync();

                    break;
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (from == ConcurrencyErrorMaxRetryTimes)
                    {
                        throw;
                    }
                    await Task.Delay(1);
                }
            }
            // 创建状态机实例
            var stateMachineInstance = await _stateMachineInstanceStore.CreateInstance(
                stateMachineEntity, stateMachineInstanceEntity);

            // 运行状态机, 从这里开始会在后台运行
#pragma warning disable CS4014
            _stateMachineInstanceStore.RunInstance(stateMachineInstance);
#pragma warning restore CS4014
            return(StateMachineInstancePatchResultDto.Success());
        }