Java 我';我对不完整的未来做了错事';t并行执行

Java 我';我对不完整的未来做了错事';t并行执行,java,multithreading,spring-boot,asynchronous,Java,Multithreading,Spring Boot,Asynchronous,我已经将一个列表拆分为5个部分,我想使用restTemplate并行执行,我有以下方法: @Async private CompletableFuture<List<Cidade>> MontarCidadesPorEstado(List<Cidade> listaCidades, List<UF> estado) { estado.forEach(es -> { Map<String, String&

我已经将一个列表拆分为5个部分,我想使用restTemplate并行执行,我有以下方法:

@Async
private CompletableFuture<List<Cidade>> MontarCidadesPorEstado(List<Cidade> listaCidades, List<UF> estado) {

    estado.forEach(es -> {
            Map<String, String> param = new HashMap<String, String>();
            param.put("UF", es.getSigla());

            Cidade[] cidades = restTemplate.getForObject(url, Cidade[].class, param);

            listaCidades.addAll(Arrays.asList(cidades));
     });

    return CompletableFuture.completedFuture(listaCidades);
}

我做错了什么,我认为当我调用
CompletableFuture时应该执行方法MontarcidaDesprestado。所有的
我假设MontarcidaDesprestado是一个本地方法调用

因此,调用是本地的,它不通过代理,也不是异步的


您已经在另一个bean中定义了montarcidadespriestado方法,然后调用这个bean。

不,只是montarcidadespriestado。这是否回答了您的问题?从并发性的角度来看,在另一个bean中定义它实现了什么?@Savior:我花了一些时间才看到,但是问题被标记为“spring”,并且方法上有
@Async
。因此OP认为他的方法应该是异步的(在另一个线程上执行),因为他使用了注释(而不是因为他使用了completable futures)。在这种情况下,Simon的回答是有意义的:
@Async
不会被触发,因为
@Async
注释只通过Spring上的AOP触发,而AOP需要非本地调用(在Spring中,大多数方面都放在对象边界,而不是本地方法边界)。@GPI我明白了,谢谢。所以OP打算让MontarcidaDesprestado异步进行,明白了吗?为了不留下太多误导性的词汇,我所说的“大多数方面都放在对象边界上”实际上更多:注释驱动的行为通常是通过改变用户bean(装饰、AOP、代理或其他方式)来实现的,这相当于“包装”它(该包装器随后成为Spring管理的bean)。因此,该行为是在调用包装器时触发的,而不是在调用包装实例时触发的。这就是为什么在bean中发生的本地方法调用(发生在包装实例中)不会触发许多注释驱动的行为,其中包括
@Transactionnal
@Async
。我将MontarcidaDesprestado放在另一个服务中,它可以工作谢谢
     List<List<UF>> subSets = Lists.partition(estados, 5);
     List<CompletableFuture<List<Cidade>>> lstCompletableFuture = new ArrayList();

     subSets.forEach(estado -> {
         lstCompletableFuture.add(MontarCidadesPorEstado(listaCidades, estado));
     });

     CompletableFuture.allOf(lstCompletableFuture.toArray(new CompletableFuture[lstCompletableFuture.size()]));