当Cassandra在Akka完成编写操作时收到通知

时间:2013-10-01 23:00:34

标签: scala cassandra akka

this Akka and Cassandra tutorial中,integration test that writes to Cassandra and expects to read back the same data在写入和读取之间插入1秒的延迟。延迟允许写请求的时间通过网络传输并在服务器上处理。这是必要的,因为application calls session.executeAsync向Cassandra发送请求,而没有处理来自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操作的同时,您将如何更改代码来执行此操作?

2 个答案:

答案 0 :(得分:2)

executeAsync returns [java] future您可以等待或附加一些回调(感谢它从guava实现ListenableFuture)。一般替代方案可能是在akka未来使用sync api。

答案 1 :(得分: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],当未来完成时,操作也是如此。