我在Vertx框架上用Java编写,我有一个关于阻塞代码的架构问题。 我有一个JsonObject,由10个对象组成,如下所示:
{
“系统”: “CD0”,
“系统”: “CD1”,
“系统”: “CD2”,
“系统”: “CD3”,
“系统”: “CD4”,
“系统”: “CD5”,
“系统”: “CD6”,
“系统”: “CD7”,
“系统”: “CD8”,
“系统”: “CD9”
}
我还有一个同步函数,它从JsonObject获取一个对象,并在将对象发送给它时使用SOAP Web服务。 SOAP Web服务获取内容(例如CD0),几秒钟后返回一个Enum。 然后我想恢复返回的枚举值,并将其保存在某种数据变量中(如哈希表)。
我最终想要的是一个迭代所有JsonObject对象的函数,并且对于每个对象,并行运行阻塞代码。 我希望它并行运行,所以即使其中一个函数调用需要等待20秒,它也不会卡住其他调用。
我怎么能在vertx中做这样的事情?
p.s:如果你能纠正我写的错误,我将不胜感激。
答案 0 :(得分:1)
为什么不使用rxJava和" zip"单独的电话? Vertx也非常支持rxJava。假设您使用不同的String
参数调用10次相同的方法并返回另一个String
,您可以执行以下操作:
private Single<String> callWs(String arg) {
return Single.fromCallable(() -> {
//DO CALL WS
return "yourResult";
});
}
然后只使用一些参数:
String[] array = new String[10]; //get your arguments
List<Single<String>> wsCalls = new ArrayList<>();
for (String s : array) {
wsCalls.add(callWs(s));
}
Single.zip(wsCalls, r -> r).subscribe(allYourResults -> {
// do whatever you like with resutls
});
有关zip函数和反应式编程的更多信息:reactivex.io