我有三个功能updateFieldFromCollection1(),insertFromColletion1ToCollection2()和deleteFromCollection1()现在。
这些调用并不相互依赖,但是当我想在completableFuture 中链接它们时,它们必须按照给定的顺序一个接一个地运行。
update-> insert -> delete
Run Code Online (Sandbox Code Playgroud)
调用不返回任何内容,因此我使用的是runAsync和thenRun的completableFuture方法。并相应地将它们链接起来。我正在迭代 msgIds,它是一个字符串列表。
msgIds.stream().forEach(msgId -> CompletableFuture.runAsync(() ->
{updateFieldFromCollection1()}).thenRun(() ->
{insertFromColletion1ToCollection2()}).thenRun(() ->
{deleteFromCollection1()}));
Run Code Online (Sandbox Code Playgroud)
上面的代码有效(更新-> 插入-> 删除已完成)但会抛出像duplicateKey 和bulkwrite 这样的异常。我确信问题出现是因为在前一个线程完成其任务之前另一个线程正在启动。我希望它们异步运行,但我想通过避免冲突来规范线程。
我不确定我需要在哪里调整代码。