Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }