0

このAkka と Cassandra のチュートリアルでは、 Cassandraに書き込み、同じデータを読み戻すことを期待する統合テストにより、書き込みと読み取りの間に 1 秒の遅延が挿入されます。遅延により、書き込み要求がネットワーク経由で送信され、サーバーで処理される時間が確保されます。これが必要なのは、アプリケーションがsession.executeAsyncCassandra に要求を送信するために呼び出し、Cassandra からの応答を処理せずに続行するためです。

class TweetWriterActor(cluster: Cluster) extends Actor {
  val session = cluster.connect(Keyspaces.akkaCassandra)
  val preparedStatement = session.prepare("INSERT INTO tweets(key, user_user, text, createdat) VALUES (?, ?, ?, ?);")

  def saveTweet(tweet: Tweet): Unit =
    session.executeAsync(preparedStatement.bind(tweet.id.id, tweet.user.user, tweet.text.text, tweet.createdAt))

  def receive: Receive = {
    case tweets: List[Tweet] => tweets.foreach(saveTweet)
    case tweet: Tweet        => saveTweet(tweet)
  }
}

通常、書き込み要求の完了には 1 秒よりもはるかに短い時間がかかるため、代わりに、読み取りを試行する前に書き込みが完了したという通知を受け取ると、テストをより速く実行できます。ノンブロッキング I/O 操作に固執しながら、これを行うためにコードをどのように変更しますか?

4

2 に答える 2

2

executeAsync は[java] futureを返します。これを待機したり、コールバックをアタッチしたりできます (guava から ListenableFuture を実装しているため)。一般的な代替手段は、akka future 内から同期 API を使用することです。

于 2013-10-01T23:15:57.507 に答える
0

CQL 3.0 を完全にサポートする Apache Cassandra および Datastax Enterprise の公式 Scala ドライバーは、phantomです。

Phantom は、公式の Datastax パートナーである Websudos で開発され、他のすべてのドライバーに取って代わることを明確に示しています。Cassandra のすべての最新機能を完全にサポートして、積極的に開発および保守されています。

書き込みが完了したときに「通知」を受けるには、デフォルトの API を使用します。SomeTable.update.where(_.id eqs id).update(name setTo "test").future()

これは を返しFuture[ResultSet]、future が完了すると操作も完了します。

于 2015-02-27T19:41:13.593 に答える