springframework.data.repository.reactive.ReactiveCrudRepository.save()从CompletableFuture.runAsync调用时不保留数据>> [

问题描述 投票:0回答:1

问题:我完全陷入了第一步的工作:将数据保存到MongoDb。我可以异步地运行一个简单的system.out.print,但是从不让ReactiveCrudRepository.save()持久保存数据。参见下面的代码。

我很高兴其余的工作,因为如果我尝试不使用CompletableFuture进行保存,则使用此方法一切都会很好:

//properly working without CompletableFuture public void SimpleSaveMehtod(Extrato e) { extratoRepository.save(e); // .subscribe(); }

这里是包含“ runPrintAsync.get();”的服务方法代码。完美工作(打印消息),但“ runSaveAsync.get();”根本没有保存。我通过“ ForkJoinPool.commonPool()。awaitQuiescence(3,TimeUnit.SECONDS)”进行了尝试,但它也无法正常工作(老实说,如果我尝试使用get btw进行阻止,我认为等待是没有道理的。) >

@Async("threadPoolTaskExecutor") public void transferirVoidReturned(Extrato e) { ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2); CompletableFuture<Void> runSaveAsync = CompletableFuture.runAsync(() -> extratoRepository.save(e),newFixedThreadPool); CompletableFuture<Void> runPrintAsync = CompletableFuture.runAsync(() -> System.out.print("I am printed"), newFixedThreadPool); try { // ForkJoinPool.commonPool().awaitQuiescence(3, TimeUnit.SECONDS); runSaveAsync.get(); runPrintAsync.get(); } catch (InterruptedException | ExecutionException e1) { e1.printStackTrace(); } }

如果相关,这里是存储库:

import org.springframework.data.mongodb.repository.Query; import org.springframework.data.repository.reactive.ReactiveCrudRepository; import com.noblockingcase.demo.model.Extrato; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.data.domain.Pageable; public interface ExtratoRepository extends ReactiveCrudRepository<Extrato, String> { @Query("{ id: { $exists: true }}") Flux<Extrato> retrieveAllExtratosPaged(final Pageable page); }

上下文:我想将数据异步保存到MongoDb。当Front(例如Angular / Mobile)调用Controller EndPoint时,它将调用Service方法,该方法旨在首先将数据保存到MongoDb,如果可以的话......>

tl; dr

:您需要订阅Monopublic void SimpleSaveMehtod(Extrato e) { extratoRepository.save(e).subscribe(); }

Background:在Future上使用反应类型的许多基本原理之一和类似之处在于,它们允许延迟执行计算。这意味着,当您创建MonoFlux或任何其他结构并添加一些计算时,只有在需要时才会执行。

现在的编写方式,一旦创建Mono,该线程就返回到池中,因为没有更多的工作要做。由于未进行预订,因此永远不会执行Mono中的计算。
mongodb spring-data future completable-future forkjoinpool
1个回答
1
投票

tl; dr

© www.soinside.com 2019 - 2024. All rights reserved.