在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。
发布于 2015-02-28 03:41:14
Apache Cassandra和Datastax Enterprise的官方Scala驱动程序是phantom,完全支持CQL3.0。
Phantom是在Websudos开发的,它是Datastax的官方合作伙伴,明确地为所有其他驱动程序提供超级种子。它正在积极地开发和维护,完全支持所有最新的Cassandra功能。
要在写入完成时得到“通知”,您可以使用默认的接口:SomeTable.update.where(_.id eqs id).update(name setTo "test").future()
这将返回Future[ResultSet],当将来完成时,操作也会返回。
https://stackoverflow.com/questions/19127411
复制相似问题