【问题标题】:Asynchronous microservices in javajava中的异步微服务
【发布时间】:2018-11-02 05:09:43
【问题描述】:

我的任务是为电影管理创建两个简单的微服务。其中一个负责电影,另一个负责评论。我必须创建添加评论的功能(评论将在批准后添加)。检查评论电影服务应该异步调用批准(评论)服务。这是我第一次使用异步方法,我不知道应该如何创建它。

以下是我从电影服务到添加评论的简单方法。

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 完成后将其发回。

【问题讨论】:

    标签: java spring-mvc spring-boot asynchronous microservices


    【解决方案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);
    }
    

    【讨论】:

    • 到目前为止,我创建了没有异步的简单方法,这就是我返回布尔值的原因。错了吗?
    • 同步执行操作并返回其结果不是异步的。
    • 您的示例需要任何弹簧注释吗?
    • 不,这是纯 java
    • 我不明白。如果 addReview 方法无效,我不会向 addReviewForMovie 方法返回任何内容,那么我怎么知道是否发生了魔法?此外,回调接口是做什么的?你能给我一个完整的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 2021-07-24
    • 2022-06-18
    • 2021-08-19
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多