cassandra驱动程序:在期货清单

时间:2018-03-16 21:47:22

标签: java asynchronous cassandra kotlin future

我有一个期货清单,可以从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)
    }
}

但是,有两件事我不喜欢/不知道。一个是它正在改变我们必须在外部定义的状态。另一个是我仍然不知道如何从失败点(studentIdonFailure阻止)获取catch

1 个答案:

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

对于非阻止,您可以使用ListenableFutureAsynchronous queries with the Java driver