在执行可能会失败或成功的操作时,我一直在使用Handler<AsyncResult<T>>
,以便可以在准备就绪时异步传递结果。
例如,操作可能类似于在缓存中添加条目,如下所示
public void putEnvironmentVariable(String variableName, EnvVariable variable, Handler<AsyncResult<Long>> rsHandler) {
redisClient.hset(ENV_CACHE, variableName, Json.encode(variable), rsHandler);
}
在上面的示例中,我利用Vert.x-redis将条目添加到集合中。
现在,如果必须执行相同的操作才能将多个条目添加到缓存中,我将按照以下所述进行操作
list.forEach(envVariable -> {
redisUtils.putEnvironmentVariable(envVariable.getName(), envVariable, result -> {
});
});
问题:
1)这种方法对吗?还是可以通过更简单/更好的方式来完成?
2)这里我以一个例子为例,但是总的来说,如果需要执行如上所述的某些操作,并且将所有操作的结果组合起来传递给调用方法,那又如何才能实现呢? x?
我正在使用 Vert.x 3.6.3
答案 0 :(得分:0)
当您必须执行多个异步操作并将其结果合并为一个结果时,您有两种选择:
您将redisClient.hset()异步结果包装在Vert.x Future
中,然后使用Vert.x CompositeFuture
加入所有这些异步操作:
Future<Long> fut = Future.future();
redisClient.hset(ENV_CACHE, variableName, Json.encode(variable), fut);
然后,当您拥有所有期货的列表时,可以使用CompositeFuture:
CompositeFuture
.all(futuresList)
.map(cf -> /*aggregate all results in one single result*/)
如果您将Vert.x与RxJava 2一起使用,则可以使用combinators合并所有Single,然后使用aggregators组合最终结果
选择取决于您,无论如何,我建议您使用RxJava 2来查看Vert.x。RxJava 2运算符可以很好地与Vert.x异步操作配合使用,并可以轻松解决此类问题