在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操作的同时,您将如何更改代码来实现这一点?
发布于 2013-10-02 07:15:58
executeAsync returns java,您可以等待或附加一些回调(这要归功于它从ListenableFuture实现的事实)。一般的替代方案可能是从akka内部使用sync api。
https://stackoverflow.com/questions/19127411
复制相似问题