示例#1
0
        public void GetFlights(FlightsPresetSearchParams flightsPresetSearchParams, long chatId, Action <IEnumerable <Flight>, DestinationPlace, long, bool> callback)
        {
            List <FlightSearchParams> flightSearchParams = new List <FlightSearchParams>();

            // missed logic of range search
            foreach (DestinationPlace dPlace in flightsPresetSearchParams.DestinationPlaces)
            {
                FlightSearchParams flightSearchParam = new FlightSearchParams();
                flightSearchParam.DestinationPlace = dPlace;
                flightSearchParam.InboundDate      = flightsPresetSearchParams.EndDateOfRange;
                flightSearchParam.OutboundDate     = flightsPresetSearchParams.StartDateOfRange;
                flightSearchParams.Add(flightSearchParam);
            }
            int      maxRetryAttempts     = 3;
            TimeSpan pauseBetweenFailures = TimeSpan.FromMinutes(5);
            int      iteration            = 0;

            Parallel.ForEach(flightSearchParams, async(flightSearchParam) =>
            {
                log.Info("start get data for " + flightSearchParams.ToString());
                var retryPolicy = Policy
                                  .Handle <Exception>()
                                  .WaitAndRetryAsync(maxRetryAttempts, i => pauseBetweenFailures);
                try
                {
                    await retryPolicy.ExecuteAsync(async() =>
                    {
                        log.Info(string.Format("Getting data for search params {0} , try no [{1}]  ", flightSearchParams.ToString(), iteration));
                        IEnumerable <Flight> flights = GetFlights(flightSearchParam, flightsPresetSearchParams.FlightSerachFilter);
                        log.Info(string.Format("Data for search params {0} , received ", flightSearchParams.ToString()));
                        bool res;
                        lock (locker)
                        {
                            iteration++;
                            res = iteration == flightSearchParams.Count;
                        }
                        if (res)
                        {
                            callback(flights, flightSearchParam.DestinationPlace, chatId, true);
                        }
                        else
                        {
                            callback(flights, flightSearchParam.DestinationPlace, chatId, false);
                        }
                    });
                }
                catch (Exception e)
                {
                    log.Error(string.Format("Getting data for search params {0} , failed ", flightSearchParams.ToString()));
                }
            });
        }
        private static void SearchFlight(FlightSearchParams flightSearchParams, long chatId)
        {
            Core core = new Core();
            List <DestinationPlace> destinationPlaces = new List <DestinationPlace>()
            {
                DestinationPlace.UKRAINE_KIEV, DestinationPlace.UKRAINE_LVIV, DestinationPlace.UKRAINE_ODESA
            };

            FlightsPresetSearchParams flightsPresetSearchParams = new FlightsPresetSearchParams();

            flightsPresetSearchParams.DatesRangeSearch   = false;
            flightsPresetSearchParams.StartDateOfRange   = new DateTime(2018, 11, 14);
            flightsPresetSearchParams.EndDateOfRange     = new DateTime(2018, 11, 20);
            flightsPresetSearchParams.FlightSerachFilter = new FlightSerachFilter();
            flightsPresetSearchParams.DestinationPlaces  = destinationPlaces;
            Task.Run(() => core.GetFlights(flightsPresetSearchParams, chatId, ProcessGetFlightsCallBack));
        }