如何从主线程进行Aync调用而不是Spingboot中的阻塞调用

时间:2020-06-02 10:16:55

标签: java spring-boot completable-future

我有以下文件

1.SpringBootApplication(DealParserApiApplication)

@SpringBootApplication
@ComponentScan(basePackages = "com.parser.*")
@EnableAsync
@EnableCaching(proxyTargetClass = true)
public class DealParserApiApplication{

    public static void main(String[] args) {
        SpringApplication.run(DealParserApiApplication.class, args);
    }

    @Bean
    public WebClient webClient() {
        return WebClient.create();
    }



}

2。控制器类DealParserAdminController,该类调用服务类中的方法evaluvateDeal

@Service
public class Evaluator implements IEvaluator {

此评估交易有许多步骤要执行,任务之一是从端点获取该交易的更多细节。

3。创建一个组件

@Component
public class DealDetails implements IDealDetails {

进行这种隔离,使方法Async

 @Override
    @Async
    public CompletableFuture<DealDetails> getDealDetails(String URI) {


        long start  = Instant.now().toEpochMilli();
        return  CompletableFuture.supplyAsync ( () -> {
        RestTemplate restTemplate = new RestTemplate();
            ..
            ..
            ..
           DealDetails dealDetails = responseEntity.getBody();
        return dealDetails 
        });

4。在evaluvateDeal中,我们开始做一些事情,然后打电话获取更多详细信息

line 1 :  List<roles> roles= repository.findByCriteria(filters);
line 2 :  Boolean Flag = rules.stream().map(Role::getRoleLevel).filter("IsManager"::equals).findFirst().isPresent();
line 3 : //Go and Grab additional details
line 4 :  CompletableFuture<DealDetails> dealDetailsFut = dealDetails.getDealDetails(URI);
line 5 :  DealDetails dealDetails =null;
line 6 :  try {
line 7 :       dealDetails = dealDetailsFut.get();
               ::
               ::
               ::
line 10 : dealDetails.setRoles(someObj);

当我查看控制台日志

2020-06-02 14:57:25.083  INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator  : 
2020-06-02 14:57:25.086  INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator  : 
2020-06-02 14:57:25.110  INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails   : 
2020-06-02 14:57:26.471  INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails   : 
2020-06-02 14:57:26.471  INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails   : 
2020-06-02 14:57:26.472  INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails   :
2020-06-02 14:57:36.472  INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails   :
2020-06-02 14:57:25.083  INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator  : 
2020-06-02 14:57:25.086  INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator  : 

即使我使用@Async和CompleteFuture,看来nio-8080-exec-1正在等待onPool-worker-1完成

问题:-

1。我的低估正确吗?

2。有什么办法使MAIN线程(nio-8080-exec-1)等待吗?

谢谢

0 个答案:

没有答案
相关问题