0

给定 Quarkus 应用程序中的订阅:

Uni.createFrom.Item(1)
    .chain { it -> processA(it) }
    .emitOn(Infrastructure.getDefaultWorkerPool())
    .chain { it -> processB(it) }
    .chain { it -> processC(it) }
    .subscribe().with{ it -> processD(it) }

如果我理解正确,processA将在调用者线程上执行(所以如果它在 Verticle 中,它应该在 IO 线程上),processB并将processC在工作线程上执行,processD将再次在调用者/IO 线程上。

我怎样才能processC在 IO 线程上被调用,同时processB仍在工作线程上?有没有一种简单的方法可以将事件带回调用者线程?


编辑:现在我正在使用以下解决方法:

Uni.createFrom.Item(1)
    .chain { it -> processA(it) }
    .chain { i -> Uni.createFrom().future { Infrastructure.getDefaultWorkerPool().submit{ processB(i) } } }
    .chain { it -> processC(it) }
    .subscribe().with{ it -> processD(it) }
4

1 回答 1

2

您需要捕获 Vert.x 上下文并切换回它。像这样的东西会起作用(使用 Java,因为我的 Kotlin 不是很好):

Context context = Vertx.currentContext();
Uni.createFrom().item(1)
   .chain(it -> processA(it))
   .emitOn(Infrastructure.getDefaultWorkerPool())
   .chain(it -> processB(it))
   .emitOn(runnable -> context.runOnContext(ignored -> runnable.run())
   .chain(it -> process(it))
   .subscribe().with(it -> processD(it));
于 2022-01-26T09:00:32.693 回答