You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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; 
}

我的核心疑问

我理解异步调用的关键是电影服务的方法不需要等待评审服务完成审批就可以直接返回,后续再处理评审的结果,但我不确定自己现在写的代码是否符合这个逻辑。比如电影服务里的completableFuture.get()是不是会阻塞线程,导致还是同步的效果?希望大家帮我验证这个实现,并告诉我正确的异步实现方式应该怎么做。

内容的提问来源于stack exchange,提问作者Bob

火山引擎 最新活动