public static async Task <SearchFlightResult> RunOrchestrator( [OrchestrationTrigger] DurableOrchestrationContext context) { var searchFlightCommand = context.GetInput <SearchFlightCommand>(); var searchFlightTask = context.CallActivityAsync <IEnumerable <FlightSearchResultItem> >(nameof(SearchFlightActivity), searchFlightCommand); var searchHotelsTask = context.CallActivityAsync <IEnumerable <HotelSearchResultItem> >(nameof(SearchHotelActivity), searchFlightCommand); var searchTicketTask = context.CallActivityAsync <IEnumerable <TicketSearchResultItem> >(nameof(SearchTicketActivity), searchFlightCommand); var result = new SearchFlightResult() { SearchId = searchFlightCommand.SearchId, }; // Optionally search for tickets, but do not wait longer than 5 seconds using (var timeoutCts = new CancellationTokenSource()) { var ticketSearchTimeoutTask = context.CreateTimer(context.CurrentUtcDateTime.AddSeconds(10), timeoutCts.Token); await Task.WhenAll(new Task[] { searchFlightTask, searchHotelsTask }); var winner = await Task.WhenAny(searchTicketTask, ticketSearchTimeoutTask); if (winner == searchTicketTask) { result.Tickets = searchTicketTask.Result; } if (!ticketSearchTimeoutTask.IsCompleted) { timeoutCts.Cancel(); } } result.Flights = searchFlightTask.Result; result.Hotels = searchHotelsTask.Result; result.SearchTime = (int)DateTime.UtcNow.Subtract(context.CurrentUtcDateTime).TotalMilliseconds; if (!string.IsNullOrEmpty(searchFlightCommand.ReturnUrl)) { var callReturnActivityCommand = new CallReturnActivityCommand() { ReturnUrl = searchFlightCommand.ReturnUrl, Result = result }; await context.CallActivityAsync <bool>(nameof(CallReturnUrlActivity), callReturnActivityCommand); } return(result); }
public static async Task <bool> CallReturnUrlActivity([ActivityTrigger] CallReturnActivityCommand callReturnActivityCommand, TraceWriter log) { try { var response = await HttpClientFactory.Create().PostAsJsonAsync(callReturnActivityCommand.ReturnUrl, callReturnActivityCommand.Result); if (response.IsSuccessStatusCode) { return(true); } } catch (Exception ex) { log.Error("Calling return url", ex); } return(false); }