- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 java 8 CompletionStages 串行执行 2 个异步方法,以便在第一个失败时不执行第二个。但是当我调用 thenCompose 时,传入的函数似乎在前一个函数完成之前就开始了(例如:这两个函数错误地并行执行。代码如下:
public CompletionStage<Graph> create(Payload payload) {
CompletionStage<BlobInfo> fileFuture = createFile(payload);
CompletionStage<Entity> metadataFuture = createMetadata(payload);
return fileFuture
.thenCompose(ignore -> metadataFuture)
.thenApply(entity ->
buildFromEntity(objectMapper, entity));
}
public CompletionStage<BlobInfo> createFile(Payload payload) {
return CompletableFuture.supplyAsync(() -> {
try {
return
storage.create(
BlobInfo
.newBuilder(payload.bucket, payload.name)
.build(),
payload.data.getBytes());
} catch (StorageException e) {
LOG.error("Failed to write to storage: " + e);
throw new RequestHandlerException(StatusCode.SERVER_ERROR,
"Failed to write to storage.");
}
});
}
public CompletionStage<Entity> createMetadata(Payload payload) {
return CompletableFuture.supplyAsync(() -> createSync(payload));
}
private Entity createMetadataSync(Payload payload) {
Key key = keyFactory.newKey(payload.id);
Entity.Builder entityBuilder = GraphPayload.buildEntityFromGraph(payload, key);
Entity entity = entityBuilder.build();
LOG.error("Metadata.createSync");
try {
datastore.add(entity);
} catch (DatastoreException e) {
LOG.error("Failed to write initial metadata: " + e);
throw new RequestHandlerException(StatusCode.SERVER_ERROR,
"Failed to write initial metadata.");
}
return entity;
}
输出:
16:57:47.530 [ForkJoinPool.commonPool-worker-3] ERROR com.spotify.nfgraphstore.store.FileStore - CreateFile
16:57:47.530 [ForkJoinPool.commonPool-worker-2] ERROR com.spotify.nfgraphstore.store.MetadataStore - Metadata.createSync
16:57:47.530 [ForkJoinPool.commonPool-worker-3] ERROR com.spotify.nfgraphstore.store.FileStore - Failed to write initial graph to storage: com.google.cloud.storage.StorageException: X
记录的输出表明 Metadata.createSync 在 Storage 异常被抛出之前被执行。如果对文件存储 DB 的写入失败,该结论也由一项测试(未显示)得出,该测试应该显示与元数据 DB 的零交互。该测试有时会失败,表明存在竞争条件。
所以我认为 thenCompose 不能保证串行执行。但是我在 java 文档中阅读的所有内容都表明执行应该是串行的:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenCompose-java.util.function.Function-
有谁知道为什么不能保证串行执行,或者推荐其他可能更符合我预期的功能?
最佳答案
调用 createMetadata
会立即启动任务,因为它不是作为传递给 thenCompose
的 lambda 表达式的一部分调用的。
也许你打算这样做:
.thenCompose(ignore -> createMetadata(payload))
关于java - CompletionStage.thenCompose 不连续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46331735/
我开始使用CompletableFuture在 Spring Boot 中,我在某些地方看到常用的存储库方法返回 CompletableFuture 而不是Entity . 我不知道发生了什么,但是当
我有一个由 2 个异步步骤组成的过程。第二步基于第一步的结果运行。该过程在循环中启动。挑战在于第二步是由多个异步任务完成的,这些任务采用第一步迭代的输出。第一步完成后,我想使用第一步结果启动 n 秒步
我正在尝试使用 java 8 CompletionStages 串行执行 2 个异步方法,以便在第一个失败时不执行第二个。但是当我调用 thenCompose 时,传入的函数似乎在前一个函数完成之前就
我对the contract有些误解的 thenCompose(Function> fn) .这是那里所说的: Returns a new CompletionStage that, when thi
我想在另一个 CompletableFuture 完成后执行一个 CompletableFuture,无论第一个是否异常完成(.thenCompose()仅在执行正常完成时运行)。 例如: Compl
鉴于这段代码: public List findPrices(String product){ List> priceFutures = shops.stream()
这个问题在这里已经有了答案: CompletableFuture | thenApply vs thenCompose (6 个回答) 4年前关闭。 我试图理解 CompletableFuture,并
这个问题和这个问题不一样Difference between Java8 thenCompose and thenComposeAsync因为我想知道作者使用thenCompose的原因是什么而不是
我无法理解 thenApply 和 thenCompose 之间的区别。 那么,有人可以提供一个有效的用例吗? 来自 Java 文档: thenApply(Function fn) Returns a
请在下面找到我实际代码的虚构示例。为了解释我想要实现的目标,这个示例被过度简化了。 public class TestClass { ForkJoinPool forkJoinPool = new F
我有一系列 thenCompose电话,类似于 myObject.updateDB(payload) .thenCompose(__ -> getUserID(payload.ID()))
假设我有 CompletableFutures A、B 和 C 是可运行的。 B 依赖于 A,C 依赖于 A 和 B,我可以先做 A,然后组合 B 和 B,然后组合 A,这样 C 就可以从 A 和 B
我遇到了 Java 8 CompletableFuture thenCompose 方法的奇怪行为。我有两个测试,只是执行顺序不同。这两个测试都模拟了 thenCompose 中生成的 Complet
我的同事喜欢的 Java 8 编码风格是一直链接异步调用,例如 CompletionStage someMethod() { return doSomething().thenCompose(
我正在学习 CompletableFuture。 我不是在问 the difference between thenApply() and thenCompose() . 相反,我想问一下感觉不对的代
我是一名优秀的程序员,十分优秀!