gpt4 book ai didi

java - 如何使用 Mutiny 响应式(Reactive)编程调用长时间运行的阻塞 void 返回方法?

转载 作者:行者123 更新时间:2023-12-05 04:52:00 25 4
gpt4 key购买 nike

我在 Mutiny 的 Uni 上有一个 Async 和 Sync 方法调用链,一些方法是一个长期运行的进程,返回类型为 void

在不阻塞下游的情况下调用它们的正确方法是什么?

下面是简单的类比代码

class Root {

public static void main(String[] args) {

final Response response = getResponsePayload(); // Gets the the Payload from upstream service
Uni.createFrom().item(response)
.onItem().invoke(() -> System.out.println("Process Started"))
.onItem().call(res -> {
longRunningMethodAsync(res); // long running blocking method, I want to run on a worker thread
return Uni.createFrom().voidItem(); // This line I created, because of the ppipeline will be broken if the Uni is not returned from here
})
.onItem().transform(item -> item.hello + " mutiny")
.onItem().transform(String::toUpperCase)
.subscribe().with(
item -> System.out.println(">> " + item)); // This is printed to the console
}



// Boilerplate method - I created to invoke/call the actual method actual method - `longRunningMethod`, this method basically an adapter
// This is the best apprach I could come up, but I'm looking for better thatn this as I'm not conviced I'm doing it right
private static UniSubscribe<Void> longRunningMethodAsync(final Response response) {


return Uni.createFrom().voidItem().invoke(() -> longRunningMethod(response))
.runSubscriptionOn(Infrastructure.getDefaultExecutor()).subscribe();
}


// Important - this is the method I want to run asynchronously independently of main *event-loop* thread.
private static void longRunningMethod(final Response response) {

System.out.println("Long running process started"); // Doesn't get printed, which means this is never called at all, not even in the blocked manner by the main even-loop thread
}




// Not as importatnt, I provded this in case if you like to run on your local box
private static Response getResponsePayload() {
return new Response();
}

private static class Response {
public final String hello = "hello";
}
}

最佳答案

通常,使用runSubscriptionOn 并传递一个特定的执行器:

longRunningMethodAsync
.runSubscriptionOn(executor);

请注意,它将并发限制为执行程序中可用的线程数。

引用:

关于java - 如何使用 Mutiny 响应式(Reactive)编程调用长时间运行的阻塞 void 返回方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66626298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com