Асинхронные микросервисы в Java - PullRequest
0 голосов
/ 23 мая 2018

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

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

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 будет завершен.

1 Ответ

0 голосов
/ 23 мая 2018

Существует множество способов сделать их асинхронными.Я думаю, что вопрос слишком широкий, однако ...

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

Вы можете вернуть 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...