tl; dr
问题:我完全陷入了第一步的工作:将数据保存到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
Mono
:public void SimpleSaveMehtod(Extrato e) {
extratoRepository.save(e).subscribe();
}
Background:在
现在的编写方式,一旦创建Future
上使用反应类型的许多基本原理之一和类似之处在于,它们允许延迟执行计算。这意味着,当您创建Mono
,Flux
或任何其他结构并添加一些计算时,只有在需要时才会执行。Mono
,该线程就返回到池中,因为没有更多的工作要做。由于未进行预订,因此永远不会执行Mono
中的计算。
tl; dr