public void HandleSubOrchestrationInstanceFailedEvent(SubOrchestrationInstanceFailedEvent failedEvent) { int taskId = failedEvent.TaskScheduledId; if (this.openTasks.ContainsKey(taskId)) { OpenTaskInfo info = this.openTasks[taskId]; // When using ErrorPropagationMode.SerializeExceptions the "cause" is deserialized from history. // This isn't fully reliable because not all exception types can be serialized/deserialized. // When using ErrorPropagationMode.UseFailureDetails we instead use FailureDetails to convey // error information, which doesn't involve any serialization at all. Exception cause = this.ErrorPropagationMode == ErrorPropagationMode.SerializeExceptions ? Utils.RetrieveCause(failedEvent.Details, this.ErrorDataConverter) : null; var failedException = new SubOrchestrationFailedException(failedEvent.EventId, taskId, info.Name, info.Version, failedEvent.Reason, cause); failedException.FailureDetails = failedEvent.FailureDetails; TaskCompletionSource <string> tcs = info.Result; tcs.SetException(failedException); this.openTasks.Remove(taskId); } else { LogDuplicateEvent("SubOrchestrationInstanceFailed", failedEvent, taskId); } }
async Task <T> Execute <T>(FakeOrchestrationContext context, string name, string version, object input) { OrchestrationInstance instance = context.OrchestrationInstance; SynchronizationContext prevCtx = SynchronizationContext.Current; try { TaskOrchestration definition = orchestrationObjectManager.GetObject(name, version); if (definition == null) { throw new OrchestrationFrameworkException("Orchestration not found"); } string serializedInput = dataConverter.Serialize(input); Task <string> serializedResultTask = definition.Execute(context, serializedInput); currentExecutions.Add(instance.InstanceId, definition); string serializedResult = null; try { serializedResult = await serializedResultTask; } catch (OrchestrationFailureException e) { Exception cause = Utils.RetrieveCause(e.Details, dataConverter); var subOrchestrationFailedException = new SubOrchestrationFailedException(0, 0, name, version, e.Message, cause); throw subOrchestrationFailedException; } catch (Exception e) { var subOrchestrationFailedException = new SubOrchestrationFailedException(0, 0, name, version, e.Message, e); throw subOrchestrationFailedException; } return(dataConverter.Deserialize <T>(serializedResult)); } finally { SynchronizationContext.SetSynchronizationContext(prevCtx); TaskOrchestration orchestration = null; if (currentExecutions.TryGetValue(instance.InstanceId, out orchestration)) { currentExecutions.Remove(instance.InstanceId); completedExecutions.Add(instance, orchestration); } } }
public void HandleSubOrchestrationInstanceFailedEvent(SubOrchestrationInstanceFailedEvent failedEvent) { int taskId = failedEvent.TaskScheduledId; if (openTasks.ContainsKey(taskId)) { OpenTaskInfo info = openTasks[taskId]; Exception cause = Utils.RetrieveCause(failedEvent.Details, dataConverter); var failedException = new SubOrchestrationFailedException(failedEvent.EventId, taskId, info.Name, info.Version, failedEvent.Reason, cause); TaskCompletionSource <string> tcs = info.Result; tcs.SetException(failedException); openTasks.Remove(taskId); } else { LogDuplicateEvent("SubOrchestrationInstanceFailed", failedEvent, taskId); } }