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




Есть много способов сделать их асинхронными. Однако я думаю, что вопрос слишком широкий ...
Во-первых, нужно прекратить возвращать логическое значение, иначе вызывающий блокируется во время выполнения метода. В асинхронном коде вызывающая сторона не блокируется, но "перезванивается" после завершения операции.
Вы можете вернуть 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);
}
Синхронное выполнение операции и возврат ее результата не являются асинхронными.
Нужна ли мне весенняя аннотация для вашего примера?
Нет, это обычная Java
Я не понимаю это. Если метод addReview будет недействительным, я не буду ничего возвращать методу addReviewForMovie, так как я могу узнать, случилось ли волшебство? Более того, что делает интерфейс обратного вызова? Не могли бы вы прислать мне полный пример?
До сих пор я создавал простые методы без асинхронности, поэтому возвращаю логическое значение. Это неправильно?