quarkus - 如何将上下文传播到 Quarkus 中的并行流操作?

标签 quarkus

我有一系列简单的链式操作,它们使用在 Quarkus 服务中运行的 Panache 存储库检索和保存一些数据。这些操作并行化的地方是 ContextNotActiveException被抛出。在删除并行化的地方,代码按预期工作。
此代码有效:

    dataRepository.get()
        .map { convert(it) }
        .forEach { perist(it) }
此代码不会:
    dataRepository.get()
        .parallelStream()
        .map { convert(it) }
        .forEach { perist(it) }
Quarkus 文档非常有限,仅解决了 mutiny 或 RX 的使用。
我怎样才能传播这样的上下文 parallelStream()将工作?

最佳答案

不幸的是,Context Propagation 不能很好地处理并行 Java 流,因为使流并行化会自动将执行移动到 ForkJoinPool,这意味着您会丢失上下文。您需要以不同的方式处理并行性,而不是让 Java 流为您完成 - 您可能想要使用 org.eclipse.microprofile.context.ManagedExecutor .
假设它是 convert无论出于何种原因,需要一个事件请求上下文的方法,您需要将其调用分派(dispatch)到托管执行程序中。这将确保传播上下文。
在 Java 代码中,我能想到的与您的代码相当的一个是:

    @Inject
    org.eclipse.microprofile.context.ManagedExecutor executor;

(...)

dataRepository.streamAll()
                .forEach(i -> {
                    executor.supplyAsync(() -> {
                        return convert(i);
                    }).thenAccept(persist(i));
                });

关于quarkus - 如何将上下文传播到 Quarkus 中的并行流操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65760863/

相关文章:

quarkus - Quarkus 中的 Logback 支持

java - 如何使用 Quarkus-Gradle-Plugin 构建 uberJar

java - Uni<Void> 如何在 REST 调用中获得失败或成功响应

intellij-idea - 在 Intellij IDEA 中哪里可以找到 Quarkus 运行配置?

jax-rs - 在 Quarkus native 中运行的 JAX-RS 应用程序中使用 Jedis 池会导致 ClassNotFoundException : org. apache.commons.pool2.impl.DefaultEvictionPolicy

java - Quarkus 和 DynamoDBMapper - native 构建上的 "no mapping for HASH key"

jsp - Quarkus 如何提供 JSP 文件

java - Quarkus 响应式(Reactive) vs quarkus 命令式有关系吗?

transactions - Quarkus @Transactional 是否需要像 spring AOP 这样的公共(public)方法

java - 具有不同返回值的 Panache 查询 PanacheQuery<Entity> 而不是 ArrayList<String>