如何异步运行多个同步函数?

时间:2017-12-12 12:07:09

标签: java asynchronous synchronous vert.x

我在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:如果你能纠正我写的错误,我将不胜感激。

1 个答案:

答案 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