在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操作的同时,您将如何更改代码来执行此操作?
答案 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]
,当未来完成时,操作也是如此。