public async Task <List <Tour> > Search(SearchPattern searchPattern) { var request = new ToursRequest(Guid.NewGuid()) { SearchPattern = searchPattern }; // делаем так для того чтобы прервать ожидание, если все провайдеры ответили до истечения таймаута _providerNotResponded.TryAdd(request.RequestId, _messageBusClient.GetSubscriberCount <ToursRequest>()); //отправляем поисковый запрос _messageBusClient.SendMessage(request); // ожидаем ответа от всех провайдеров, если ответили все до истечения таймаута ожидание будет отменено try { await Task.Delay(_options.Value.RequestTimeout, _delayTokenSource.Token); } catch (TaskCanceledException) { } List <Tour> result = new List <Tour>(); _results.TryRemove(request.RequestId, out result); return(HandleResults(result, (ToursOrderEnum)searchPattern.ToursOrder)); }
private async Task ReceiveRequest(ToursRequest request) { var tours = await _tourRepository.Search(SpecificationHelper.GetSpecification(request.SearchPattern)); _messageBusClient.SendMessage(new ToursResponse(request.RequestId, nameof(OtherSearchService)) { Data = tours.Select(t => new Tour(t.Id, t.Provider.Name, t.Hotel.Name, t.RoomType.Name, t.DepartureCity.Name, t.Airline.Name, t.DepartureDate, t.ArrivalDate, t.HotelCheckInDate, t.HotelNightCount, t.HotelNightPriceByPerson, t.PersonMaxCount)).ToList() }); }
private void ReceiveRequest(ToursRequest request) { Assert.AreEqual(_requestId, request.RequestId); }