public Hashtable Invoke(OrchestrationBindingInfo orchestrationBindingInfo, IPowerShellServices pwsh) { try { var outputBuffer = new PSDataCollection <object>(); var context = orchestrationBindingInfo.Context; // context.History should never be null when initializing CurrentUtcDateTime var orchestrationStart = context.History.First( e => e.EventType == HistoryEventType.OrchestratorStarted); context.CurrentUtcDateTime = orchestrationStart.Timestamp.ToUniversalTime(); // Marks the first OrchestratorStarted event as processed orchestrationStart.IsProcessed = true; var asyncResult = pwsh.BeginInvoke(outputBuffer); var(shouldStop, actions) = orchestrationBindingInfo.Context.OrchestrationActionCollector.WaitForActions(asyncResult.AsyncWaitHandle); if (shouldStop) { // The orchestration function should be stopped and restarted pwsh.StopInvoke(); return(CreateOrchestrationResult(isDone: false, actions, output: null, context.CustomStatus)); } else { try { // The orchestration function completed pwsh.EndInvoke(asyncResult); var result = FunctionReturnValueBuilder.CreateReturnValueFromFunctionOutput(outputBuffer); return(CreateOrchestrationResult(isDone: true, actions, output: result, context.CustomStatus)); } catch (Exception e) { // The orchestrator code has thrown an unhandled exception: // this should be treated as an entire orchestration failure throw new OrchestrationFailureException(actions, context.CustomStatus, e); } } } finally { pwsh.ClearStreamsAndCommands(); } }
public void BeforeFunctionInvocation(IList <ParameterBinding> inputData) { // If the function is an orchestration client, then we set the DurableClient // in the module context for the 'Start-NewOrchestration' function to use. if (_durableFunctionInfo.IsDurableClient) { var durableClient = inputData.First(item => item.Name == _durableFunctionInfo.DurableClientBindingName) .Data.ToObject(); _powerShellServices.SetDurableClient(durableClient); } else if (_durableFunctionInfo.IsOrchestrationFunction) { _orchestrationBindingInfo = CreateOrchestrationBindingInfo(inputData); _powerShellServices.SetOrchestrationContext(_orchestrationBindingInfo.Context); } }