TaskMessage ProcessCreateSubOrchestrationInstanceDecision( CreateSubOrchestrationAction createSubOrchestrationAction, OrchestrationRuntimeState runtimeState, bool includeParameters) { var historyEvent = new SubOrchestrationInstanceCreatedEvent(createSubOrchestrationAction.Id) { Name = createSubOrchestrationAction.Name, Version = createSubOrchestrationAction.Version, InstanceId = createSubOrchestrationAction.InstanceId }; if (includeParameters) { historyEvent.Input = createSubOrchestrationAction.Input; } runtimeState.AddEvent(historyEvent); var taskMessage = new TaskMessage(); var startedEvent = new ExecutionStartedEvent(-1, createSubOrchestrationAction.Input) { Tags = OrchestrationTags.MergeTags(createSubOrchestrationAction.Tags, runtimeState.Tags), OrchestrationInstance = new OrchestrationInstance { InstanceId = createSubOrchestrationAction.InstanceId, ExecutionId = Guid.NewGuid().ToString("N") }, ParentInstance = new ParentInstance { OrchestrationInstance = runtimeState.OrchestrationInstance, Name = runtimeState.Name, Version = runtimeState.Version, TaskScheduleId = createSubOrchestrationAction.Id }, Name = createSubOrchestrationAction.Name, Version = createSubOrchestrationAction.Version }; this.logHelper.SchedulingOrchestration(startedEvent); taskMessage.OrchestrationInstance = startedEvent.OrchestrationInstance; taskMessage.Event = startedEvent; return(taskMessage); }
async Task <T> CreateSubOrchestrationInstanceCore <T>( string name, string version, string instanceId, object input, IDictionary <string, string> tags) { int id = this.idCounter++; string serializedInput = this.dataConverter.Serialize(input); string actualInstanceId = instanceId; if (string.IsNullOrWhiteSpace(actualInstanceId)) { actualInstanceId = OrchestrationInstance.ExecutionId + ":" + id; } var action = new CreateSubOrchestrationAction { Id = id, InstanceId = actualInstanceId, Name = name, Version = version, Input = serializedInput, Tags = tags }; this.orchestratorActionsMap.Add(id, action); if (OrchestrationTags.IsTaggedAsFireAndForget(tags)) { // this is a fire-and-forget orchestration, so we do not wait for a result. return(default(T)); } else { var tcs = new TaskCompletionSource <string>(); this.openTasks.Add(id, new OpenTaskInfo { Name = name, Version = version, Result = tcs }); string serializedResult = await tcs.Task; return(this.dataConverter.Deserialize <T>(serializedResult)); } }
static TaskMessage ProcessWorkflowCompletedTaskDecision( OrchestrationCompleteOrchestratorAction completeOrchestratorAction, OrchestrationRuntimeState runtimeState, bool includeDetails, out bool continuedAsNew) { ExecutionCompletedEvent executionCompletedEvent; continuedAsNew = (completeOrchestratorAction.OrchestrationStatus == OrchestrationStatus.ContinuedAsNew); if (completeOrchestratorAction.OrchestrationStatus == OrchestrationStatus.ContinuedAsNew) { executionCompletedEvent = new ContinueAsNewEvent(completeOrchestratorAction.Id, completeOrchestratorAction.Result); } else { executionCompletedEvent = new ExecutionCompletedEvent(completeOrchestratorAction.Id, completeOrchestratorAction.Result, completeOrchestratorAction.OrchestrationStatus); } runtimeState.AddEvent(executionCompletedEvent); TraceHelper.TraceInstance( runtimeState.OrchestrationStatus == OrchestrationStatus.Failed ? TraceEventType.Warning : TraceEventType.Information, "TaskOrchestrationDispatcher-InstanceCompleted", runtimeState.OrchestrationInstance, "Instance Id '{0}' completed in state {1} with result: {2}", runtimeState.OrchestrationInstance, runtimeState.OrchestrationStatus, completeOrchestratorAction.Result); TraceHelper.TraceInstance( TraceEventType.Information, "TaskOrchestrationDispatcher-InstanceCompletionEvents", runtimeState.OrchestrationInstance, () => Utils.EscapeJson(DataConverter.Serialize(runtimeState.Events, true))); // Check to see if we need to start a new execution if (completeOrchestratorAction.OrchestrationStatus == OrchestrationStatus.ContinuedAsNew) { var taskMessage = new TaskMessage(); var startedEvent = new ExecutionStartedEvent(-1, completeOrchestratorAction.Result) { OrchestrationInstance = new OrchestrationInstance { InstanceId = runtimeState.OrchestrationInstance.InstanceId, ExecutionId = Guid.NewGuid().ToString("N") }, Tags = runtimeState.Tags, ParentInstance = runtimeState.ParentInstance, Name = runtimeState.Name, Version = completeOrchestratorAction.NewVersion ?? runtimeState.Version }; taskMessage.OrchestrationInstance = startedEvent.OrchestrationInstance; taskMessage.Event = startedEvent; return(taskMessage); } // If this is a Sub Orchestration, and not tagged as fire-and-forget, // then notify the parent by sending a complete message if (runtimeState.ParentInstance != null && !OrchestrationTags.IsTaggedAsFireAndForget(runtimeState.Tags)) { var taskMessage = new TaskMessage(); if (completeOrchestratorAction.OrchestrationStatus == OrchestrationStatus.Completed) { var subOrchestrationCompletedEvent = new SubOrchestrationInstanceCompletedEvent(-1, runtimeState.ParentInstance.TaskScheduleId, completeOrchestratorAction.Result); taskMessage.Event = subOrchestrationCompletedEvent; } else if (completeOrchestratorAction.OrchestrationStatus == OrchestrationStatus.Failed || completeOrchestratorAction.OrchestrationStatus == OrchestrationStatus.Terminated) { var subOrchestrationFailedEvent = new SubOrchestrationInstanceFailedEvent(-1, runtimeState.ParentInstance.TaskScheduleId, completeOrchestratorAction.Result, includeDetails ? completeOrchestratorAction.Details : null); taskMessage.Event = subOrchestrationFailedEvent; } if (taskMessage.Event != null) { taskMessage.OrchestrationInstance = runtimeState.ParentInstance.OrchestrationInstance; return(taskMessage); } } return(null); }