Exemple #1
0
        public async Task <RunWorkflowResult?> FindAndRestartTestWorkflowAsync(
            string workflowDefinitionId,
            string activityId,
            int version,
            string signalRConnectionId,
            string lastWorkflowInstanceId,
            string?tenantId = default,
            CancellationToken cancellationToken = default)
        {
            var workflowBlueprint = await _workflowRegistry.FindAsync(workflowDefinitionId, VersionOptions.SpecificVersion(version), tenantId, cancellationToken);

            if (workflowBlueprint == null)
            {
                return(null);
            }

            var lastWorkflowInstance = await _workflowInstanceStore.FindAsync(new EntityIdSpecification <WorkflowInstance>(lastWorkflowInstanceId), cancellationToken);

            if (lastWorkflowInstance == null)
            {
                return(null);
            }

            var startActivity = workflowBlueprint.Activities.First(x => x.Id == activityId);

            var startableWorkflowDefinition = new StartableWorkflowDefinition(workflowBlueprint, startActivity.Id);

            var workflow = await InstantiateStartableWorkflow(startableWorkflowDefinition, cancellationToken);

            var previousActivityData = GetActivityDataFromLastWorkflowInstance(lastWorkflowInstance, workflowBlueprint, activityId);

            MergeActivityDataIntoInstance(workflow.WorkflowInstance, previousActivityData);

            SetMetadata(workflow.WorkflowInstance, signalRConnectionId);

            //if previousActivityOutput has any items, then the first one is from activity closest to the starting one
            var previousActivityOutput = previousActivityData.Count == 0 ? null : previousActivityData.First().Value?.GetItem("Output");

            return(await ExecuteStartableWorkflowAsync(workflow, new WorkflowInput(previousActivityOutput), cancellationToken));
        }
Exemple #2
0
        private async Task <bool> GetWorkflowIsAlreadyExecutingAsync(string?tenantId, string workflowDefinitionId)
        {
            var specification = new TenantSpecification <WorkflowInstance>(tenantId).WithWorkflowDefinition(workflowDefinitionId).And(new WorkflowIsAlreadyExecutingSpecification());

            return(await _workflowInstanceStore.FindAsync(specification) != null);
        }
Exemple #3
0
 public static Task <WorkflowInstance?> FindByCorrelationIdAsync(
     this IWorkflowInstanceStore store,
     string correlationId,
     Func <ISpecification <WorkflowInstance>, ISpecification <WorkflowInstance> > specificationBuilder,
     CancellationToken cancellationToken = default) =>
 store.FindAsync(specificationBuilder(new CorrelationIdSpecification <WorkflowInstance>(correlationId)), cancellationToken);
 public Task <WorkflowInstance?> FindAsync(ISpecification <WorkflowInstance> specification, CancellationToken cancellationToken = default) => _store.FindAsync(specification, cancellationToken);
Exemple #5
0
 public static Task <WorkflowInstance?> FindByIdAsync(
     this IWorkflowInstanceStore store,
     string id,
     CancellationToken cancellationToken = default) =>
 store.FindAsync(new WorkflowInstanceIdSpecification(id), cancellationToken);