我有一个期货清单,可以从cassandra中为studentId
s的给定列表执行数据删除:
val studentIds: List<String> = getStudentIds(...)
val boundStatements: List<BoundStatement> = studentIds.map(bindStudentDelete(it))
val deleteFutures = boundStatements.map { session.executeAsync(it) }
deleteFutures.forEach {
// callback that will send metrics for monitoring
Futures.addCallback(it, MyCallback(...))
}
上面我已经为每个发送指标的未来注册了一个回调MyCallback(...)
。然后我做:
Futures.inCompletionOrder(deleteFutures).forEach { it.get() }
等待所有删除的完成。如果由于任何原因某些期货最终失败(取消,其他出错等等),我想返回studentId
的列表,以便我以后可以处理它。
实现这一目标的最佳方法是什么?
修改 回调可以是一种改变状态以跟踪所有删除的成功/失败的方法。
class MyCallback(
private val statsDClient: StatsdClient,
private val tags: Array<String>,
val failures: MutableList<String>
) : FutureCallback<Any> {
override fun onSuccess(result: Any?) {
//send success metrics
...
}
override fun onFailure(t: Throwable) {
// send failure metrics
...
// do something here to get the associated studentId
val currId = ...
failures.add(currId)
}
}
同样,我可以使用Futures.inCompletionOrder(deleteFutures).forEach
变异try/catch
块中的状态:
val failedDeletes = mutableListOf<String>()
Futures.inCompletionOrder(deleteFutures).forEach {
try {
it.get()
} catch (e: Exception) {
// do something to get the studentId for this future
val currId = ...
failedDeletes.add(currId)
}
}
但是,有两件事我不喜欢/不知道。一个是它正在改变我们必须在外部定义的状态。另一个是我仍然不知道如何从失败点(studentId
或onFailure
阻止)获取catch
。
答案 0 :(得分:0)
我在JAVA中添加了下面的代码段。这是阻止程序。
ResultSet getUninterruptibly()
等待查询返回并返回其结果。这个方法是 通常比Future.get()更方便,因为它: 不间断地等待结果,因此不会抛出InterruptedException。 返回有意义的异常,而不必处理ExecutionException。 因此,它是获得未来结果的首选方式。
检查此链接: Interface ResultSetFuture
List<ResultSetFuture> futures = new ArrayList<>();
List<Long> futureStudentIds = new ArrayList<>();
// List<Long> successfullIds = new ArrayList<>();
List<Long> unsuccessfullIds = new ArrayList<>();
for (long studentid : studentids) {
futures.add(session.executeAsync(statement.deleteStudent(studentid)));
futureStudentIds.add(studentid);
}
for (int index = 0; index < futures.size(); index++) {
try {
futures.get(index).getUninterruptibly();
// successfullIds.add(futureStudentIds.get(index));
} catch (Exception e) {
unsuccessfullIds.add(futureStudentIds.get(index));
LOGGER.error("", e);
}
}
return unsuccessfullIds;
对于非阻止,您可以使用ListenableFuture
。
Asynchronous queries with the Java driver