Асинхронные микросервисы в java

Моя задача - создать два простых микросервиса для управления фильмами. Один из них отвечает за фильмы, а другой за обзоры. Мне нужно создать функцию для добавления отзывов (отзывы будут добавлены после утверждения). Для проверки просмотра фильма сервис должен асинхронно вызывать сервис одобрения (просмотра). Я впервые использую асинхронные методы, и я не уверен, как мне их создать.

Ниже приведен мой простой метод от сервиса фильмов до добавления обзора.

public boolean addReviewForMovie(Review review, String movieId){
    Movie movie = movieRepository.findById(movieId);
    if (movie == null){
        return false;
    }
    review.setMovieId(movieId);
    return reviewService.addReview(review);
}

Мой алгоритм одобрения очень прост - я просто хочу проверить пару параметров. Вот мой код.

public boolean addReview(Review review){
    if (review.getReviewContent().length() < 10
            || review.getReviewContent().length() > 250) {
        return false;
    }else if (review.getRating()<1d || review.getRating() > 10d){
        return false;
    }else if (review.getUserName().length() < 1
            || review.getUserName().length() > 15){
        return false;
    }
    review.setApproved(true);
    reviewRepository.save(review);
    return review.isApproved();
}

Не могли бы вы объяснить мне, как создать эти методы асинхронными? Буду признателен, если вы пришлете мне несколько статей об этом.


Я проверяю свой код, но не уверен, что это правильный способ. Думаю, я ожидаю кое-что еще.

Ниже мой метод в классе обслуживания фильмов. Использую для добавления отзыва. Этот метод должен запрашивать асинхронный.

public void addReviewForMovie(Review review){
    CompletableFuture<Boolean> completableFuture = reviewService.addReview(review);

    try {
       Boolean result = completableFuture.get();
       System.out.println(result);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

И вот мой метод одобрения

public CompletableFuture addReview(Review review){
CompletableFuture<Boolean> completableFuture = new CompletableFuture<>();
Executors.newCachedThreadPool().submit(()->{
    try{
        Thread.sleep(10000);
        boolean addedFlag = true;
        if (review.getReviewContent().length() < 10
                || review.getReviewContent().length() > 250) {
            addedFlag = false;
            completableFuture.complete(addedFlag);
        }else {
            review.setApproved(true);
            reviewRepository.save(review);
            completableFuture.complete(addedFlag);
        }
    } catch (Exception e){
        e.printStackTrace();
    }
    return null;
});
return completableFuture;

Реализация правильная? Я думал, что идея в том, что первый метод не будет ждать второй и отправлять его обратно, как только addReview будет завершен.

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

Ответы 1

Есть много способов сделать их асинхронными. Однако я думаю, что вопрос слишком широкий ...

Во-первых, нужно прекратить возвращать логическое значение, иначе вызывающий блокируется во время выполнения метода. В асинхронном коде вызывающая сторона не блокируется, но "перезванивается" после завершения операции.

Вы можете вернуть CompletableFuture, который предоставляет множество способов связать асинхронные действия.

public CompletableFuture addReview(Review review) {
   // TODO
}

Или заставьте вызывающего абонента предоставить функцию обратного вызова, которую вы вызовете, когда будет готов результат.

public void addReview(Review review, Callback callback) {
   // TODO: Add the review and when finished
   callback.onSuccess();
}

Где Callback - это интерфейс, который будет выглядеть примерно так:

interface Callback {

    void onSuccess();

    void onFailure(Throwable cause);
}

До сих пор я создавал простые методы без асинхронности, поэтому возвращаю логическое значение. Это неправильно?

Bob 23.05.2018 11:32

Синхронное выполнение операции и возврат ее результата не являются асинхронными.

ᴇʟᴇvᴀтᴇ 23.05.2018 11:39

Нужна ли мне весенняя аннотация для вашего примера?

Bob 23.05.2018 11:41

Нет, это обычная Java

Jan Ossowski 23.05.2018 11:42

Я не понимаю это. Если метод addReview будет недействительным, я не буду ничего возвращать методу addReviewForMovie, так как я могу узнать, случилось ли волшебство? Более того, что делает интерфейс обратного вызова? Не могли бы вы прислать мне полный пример?

Bob 23.05.2018 19:44

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