Потоки Java, дождитесь, пока матрица расстояний Google вернет результат - PullRequest
1 голос
/ 29 мая 2019

У меня есть список транспортных средств, которые мне нужны для расчета общего расхода топлива на транспортное средство.Я использую Java streams, чтобы пройтись по списку, получить транспортное средство, рассчитать его расстояние, используя Google distance matrix api, использовать расстояние для расчета расхода топлива и вернуть ответ.Я заметил, что программа просто зависает, скорее всего, это может быть связано с тем, что stream не ждет, пока Matrix api вернет ответ, прежде чем он перейдет к следующему элементу, я говорю это, потому что я поместил вызовы system.out.printlnMatrix 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") получаетнапечатано, а остальные нет.

1 Ответ

1 голос
/ 29 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...