in src/WebJobs.Extensions.DurableTask/Listener/TaskOrchestrationShim.cs [49:133]
public override async Task<string> Execute(OrchestrationContext innerContext, string serializedInput)
{
// Supress "Variable is assigned but its value is never used" in Functions V1
#pragma warning disable CS0219
OrchestrationRuntimeStatus status; // for reporting the status of the orchestration on App Insights
#pragma warning restore CS0219
if (this.FunctionInvocationCallback == null)
{
throw new InvalidOperationException($"The {nameof(this.FunctionInvocationCallback)} has not been assigned!");
}
if (!this.config.MessageDataConverter.IsDefault)
{
innerContext.MessageDataConverter = this.config.MessageDataConverter;
}
if (!this.config.ErrorDataConverter.IsDefault)
{
innerContext.ErrorDataConverter = this.config.ErrorDataConverter;
}
this.context.InnerContext = innerContext;
this.context.RawInput = serializedInput;
this.Config.TraceHelper.FunctionStarting(
this.context.HubName,
this.context.Name,
this.context.InstanceId,
serializedInput,
FunctionType.Orchestrator,
this.context.IsReplaying);
status = OrchestrationRuntimeStatus.Running;
// On a replay, the orchestrator will either go into a 'Completed'
// state or a 'Failed' state. We want to avoid tagging them as
// 'Running' while replaying because this could result in
// Application Insights reporting the wrong status.
if (!innerContext.IsReplaying)
{
DurableTaskExtension.TagActivityWithOrchestrationStatus(status, this.context.InstanceId);
}
var orchestratorInfo = this.Config.GetOrchestratorInfo(new FunctionName(this.context.Name));
if (!this.context.IsReplaying)
{
this.context.AddDeferredTask(() => this.Config.LifeCycleNotificationHelper.OrchestratorStartingAsync(
this.context.HubName,
this.context.Name,
this.context.InstanceId,
this.context.IsReplaying));
}
await this.InvokeUserCodeAndHandleResults(orchestratorInfo, innerContext);
// release any locks that were held by the orchestration
// just in case the application code did not do so already
this.context.ReleaseLocks();
string serializedOutput = this.context.GetSerializedOutput();
this.Config.TraceHelper.FunctionCompleted(
this.context.HubName,
this.context.Name,
this.context.InstanceId,
serializedOutput,
this.context.ContinuedAsNew,
FunctionType.Orchestrator,
this.context.IsReplaying);
status = OrchestrationRuntimeStatus.Completed;
if (!this.context.IsReplaying)
{
this.context.AddDeferredTask(() => this.Config.LifeCycleNotificationHelper.OrchestratorCompletedAsync(
this.context.HubName,
this.context.Name,
this.context.InstanceId,
this.context.ContinuedAsNew,
this.context.IsReplaying));
}
DurableTaskExtension.TagActivityWithOrchestrationStatus(status, this.context.InstanceId);
return serializedOutput;
}