cassandra executeasync - как настроить будущее guava для параллельного выполнения операций - PullRequest
0 голосов
/ 09 января 2019

относительно параметра «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)
...