Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何连锁完成期货_Java_Spring_Spring Boot_Asynchronous_Completable Future - Fatal编程技术网

Java 如何连锁完成期货

Java 如何连锁完成期货,java,spring,spring-boot,asynchronous,completable-future,Java,Spring,Spring Boot,Asynchronous,Completable Future,我现在有三个函数updateFieldFromCollection1(),insertfromcollection1tocollection2()和deleteFromCollection1() 这些调用并不是相互依赖的,但当我想在completableFuture中链接它们时,它们必须按照给定的顺序一个接一个地运行 update-> insert -> delete 这些调用没有返回任何内容,因此我使用runAsync和completableFuture的Run方法。并相应地把他

我现在有三个函数
updateFieldFromCollection1()
insertfromcollection1tocollection2()
deleteFromCollection1()

这些调用并不是相互依赖的,但当我想在completableFuture中链接它们时,它们必须按照给定的顺序一个接一个地运行

update-> insert -> delete
这些调用没有返回任何内容,因此我使用runAsync和completableFuture的Run方法。并相应地把他们锁起来。我正在迭代msgIds,它是一个字符串列表

msgIds.stream().forEach(msgId -> CompletableFuture.runAsync(() ->  
 {updateFieldFromCollection1()}).thenRun(() -> 
 {insertFromColletion1ToCollection2()}).thenRun(() ->  
 {deleteFromCollection1()}));
上面的代码可以工作(更新->插入->删除完成),但会引发duplicateKey和bulkwrite之类的异常。我确信问题的出现是因为另一个线程在前一个线程完成其任务之前启动。我希望它们异步运行,但我希望通过避免冲突来约束线程。
我不确定我需要在哪里调整代码

msgIds.stream().forEach(msgId -> {
updateFieldFromCollection1();
 CompletableFuture.runAsync(() -> 
 {insertFromColletion1ToCollection2()}).thenRun(() ->  
 {deleteFromCollection1()}));

更新必须在未来完成。然后它就像一个符咒:)

你能用堆栈跟踪添加异常吗使用:com.mongodb.MongoBulkWriteException:bulkwrite操作错误服务器写入错误:[BulkWriteError{index=0,code=11000,message='E11000重复键错误集合:collection2索引:id dup键:{:“someID”},details={}]。原因:com.mongodb.MongoWriteException:E11000重复键错误集合:集合2索引:id dup键:{:“someId”}当三个函数合并为一个函数时,代码运行平稳,没有任何异常。但是我需要分别对它们进行操作。我认为您可以使用supplySync和apply方法来测试它,然后使用
thenRunAsync
而不是
thenRun
来获取和记录以前每个Stephen的信息?