0

本 Akka 和 Cassandra 教程中,写入 Cassandra 并期望读回相同数据的集成测试在写入和读取之间插入 1 秒延迟。延迟允许写入请求有时间通过​​网络传输并在服务器上处理。这是必要的,因为应用程序调用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 操作的同时,您将如何更改代码来执行此操作?

4

2 回答 2

2

executeAsync 返回[java]未来,您可以等待或附加一些回调(感谢它从番石榴实现 ListenableFuture 的事实)。一般的替代方案可能是使用来自 akka 未来的同步 api。

于 2013-10-01T23:15:57.507 回答
0

Apache Cassandra 和 Datastax Enterprise 的官方 Scala 驱动程序完全支持 CQL 3.0,是phantom

Phantom 由 Datastax 官方合作伙伴 Websudos 开发,明确取代所有其他驱动程序。它正在积极开发和维护,完全支持所有最新的 Cassandra 功能。

要在写入完成时得到“通知”,您将使用默认 api:SomeTable.update.where(_.id eqs id).update(name setTo "test").future()

这将返回Future[ResultSet],当未来完成时,操作也是如此。

于 2015-02-27T19:41:13.593 回答