在forEach循环Java11中应用completableFuture

在forEach循环Java11中应用completableFuture,java,spring-boot,asynchronous,apache-kafka,completable-future,Java,Spring Boot,Asynchronous,Apache Kafka,Completable Future,我在我的spring boot应用程序中有一个计划任务,我想让它运行得更快 我的任务包括获取一些数据(订阅),对于每个订阅,调用API客户端并向我的kafka代理发送消息 这是我的密码 @Scheduled(cron=“0 0 12 1/1*?*”,zone=“欧洲/巴黎”) public void execute(){ List storeSubscriptions=subscriptionRepository.findAllByExpirationDate(LocalDate.now().p

我在我的spring boot应用程序中有一个计划任务,我想让它运行得更快

我的任务包括获取一些数据(订阅),对于每个订阅,调用API客户端并向我的kafka代理发送消息

这是我的密码

@Scheduled(cron=“0 0 12 1/1*?*”,zone=“欧洲/巴黎”)
public void execute(){
List storeSubscriptions=subscriptionRepository.findAllByExpirationDate(LocalDate.now().plusMonths(1));
storeSubscriptions.forEach(订阅->{
CompletableFuture.SupplySync(()->此.message(订阅))
。然后应用(消息->kt.send(订阅已过期\u提前提醒\u,消息));
});
}
消息是异步创建的吗?是否在不等待前一条消息结束的情况下创建消息


谢谢。

是的,第二条消息不会等待第一条消息的结束。 这是因为
CompletableFuture
s没有组合

如果您希望一个接一个地执行它们,您需要以下内容:

CompletableStage loop = CompletableFuture.completedFuture(null);
storeSubscriptions.forEach(subscription -> {
    loop = loop.thenCompose( unusued -> CompletableFuture
                           .supplyAsync( () -> this.message(subscription))
                           .thenAccept(message -> kt.send(SUBSCRIPTION_EXPIRED_REMINDER_EARLY,message));
});

此解决方案的缺点是可能会在内存中创建许多对象。 要避免此问题,您可以使用:

使用Maven,您可以通过以下方式将其添加到项目中:

<dependency>
    <groupId>com.ibm.async</groupId>
    <artifactId>asyncutil</artifactId>
    <version>0.1.0</version>
</dependency>

com.ibm.async

您可以在此处添加日志语句来调试您的假设
<dependency>
    <groupId>com.ibm.async</groupId>
    <artifactId>asyncutil</artifactId>
    <version>0.1.0</version>
</dependency>