относительно параметра «executor» обратного вызова guava, не уверен, что я делаю это, используя его правильно, в том смысле, что, возможно, я не достигаю полного параллелизма и параллелизма. В одном случае я конвертирую будущее гуавы в будущее скалы, в другом - пытаюсь напрямую использовать будущее гуавы, а затем ждать составного будущего
implicit def cassandraFutureToScalaFuture(future: ResultSetFuture): Future[ResultSet] = {
val promise = Promise[ResultSet]()
val callback = new FutureCallback[ResultSet] {
def onSuccess(result: ResultSet): Unit = {
promise success result
}
def onFailure(err: Throwable): Unit = {
promise failure err
}
}
Futures.addCallback(future, callback) <<<<<<<<<< uses the default "directExecutor" per the documentation
promise.future
}
def getAsync(params): Future[Option[Thing]] = {
session.executeAsync(query.bind(...)).map((resultSet: ResultSet) => resultSet.asScala
.lastOption // only 1 result should exist
.flatMap((row: Row) => parseRow(row)))
}
val objectsToGet = ....
val futuresOfThing : Seq[Future[Option[Thing]]]= objectsToGet.map {getAsync}
Future.sequence(futuresOfThing)
VS другой случай, делающий это:
val resultSetFutures: util.List[ResultSetFuture] = keys.map {
v => session.executeAsync(...v...)
}.toList.asJava
val singleFutures: ListenableFuture[util.List[ResultSet]] = Futures.successfulAsList(resultSetFutures)
singleFutures.get(operationTimeout.toMillis, TimeUnit.MILLISECONDS)