Потоки Java, подождите, пока матрица расстояний Google вернет результат

У меня есть список транспортных средств, которые мне нужны для расчета общего расхода топлива на каждое транспортное средство. Я использую Java streams, чтобы просмотреть список, получить транспортное средство, рассчитать расстояние до него с помощью Google distance matrix api, использовать расстояние для расчета расхода топлива и вернуть ответ. Я заметил, что программа просто зависает, скорее всего, это может быть связано с тем, что stream не ждет, пока Matrix api вернет ответ, прежде чем перейти к следующему элементу, я говорю это, потому что я поместил system.out.println вызовы в Matrix method, а некоторые сообщения делают не распечатать.

Код, который должен рассчитать общий расход топлива

vehicles.stream().map(vehicles ->
                calculateTotalFuelBeingUsedByAllVehicles(vehicle, getDistanceBetweenOriginsAndDestination(
                        new LatLng(vehicle.getOrigin().getLatitude(), vehicle.getOrigin().getLatitude()), new LatLng(vehicle.getDestination().getLatitude(), vehicles.getDestination().getLatitude()))))
                .collect(Collectors.toList());
    public static double getDistanceBetweenOriginsAndDestination(LatLng origin, LatLng destination){
        //Gets printed
        System.out.println("Calculating distance");
        GeoApiContext context = new GeoApiContext.Builder()
                .apiKey(GOOGLE_MAPS_API_KEY)
                .build();
        DistanceMatrixApiRequest distanceMatrixApiRequest = DistanceMatrixApi.newRequest(context)
                .mode(TravelMode.DRIVING)
                .trafficModel(TrafficModel.BEST_GUESS)
                .departureTime(Instant.now().atZone(ZoneOffset.UTC).toInstant())
                .destinations(destination)
                .origins(origin);
        try {

            long distance =  Arrays.stream(distanceMatrixApiRequest.await().rows)
                    .flatMap(distanceMatrixRow -> Arrays.stream(distanceMatrixRow.elements))
                    .mapToLong(distanceMatrixElement -> distanceMatrixElement.distance.inMeters)
                    .sum();

            //Never gets printed
            System.out.println("Calculated distance: "+distance);
            return distance;

        } catch (ApiException | InterruptedException | IOException e) {
            //Never gets printed
            System.out.println("Error encountered when calculating distance");
            e.printStackTrace();
        }
        return 0;
    }

В getDistanceBetweenOriginsAndDestination печатается System.out.println("Calculating distance"), а остальные нет.

Итак, он застревает на distanceMatrixApiRequest.await()?

Andy Turner 29.05.2019 09:10

@AndyTurner Я так думаю, но, естественно, этот метод должен возвращать ответ через некоторое время, но в данном случае это не так.

Astonio 29.05.2019 09:11

У вас опечатка при создании LatLng, вы отправляете широту вместо долготы. Возможно, Google вам не отвечает или отвечает очень долго, потому что невозможно просчитать маршрут между этими точками. Просто предложение.

DDovzhenko 29.05.2019 09:15

@DmytroDovzhenko прав, проверьте эту строку: new LatLng(vehicle.getOrigin().getLatitude(), vehicle.getOrigin().getLatitude()), есть getLatitude() два раза... Может быть, проблема здесь.

deHaar 29.05.2019 09:19

@DmytroDovzhenko вау, большое спасибо, это сработало, пожалуйста, сделайте это ответом, чтобы я мог его отметить.

Astonio 29.05.2019 09:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас опечатка при создании LatLng, вы отправляете широту вместо долготы. Возможно, Google вам не отвечает или отвечает очень долго, потому что невозможно просчитать маршрут между этими точками.

Другие вопросы по теме