过去几天我一直面临一个关于在 Scala 中保存和处理 Futures 数据的问题。我对语言和两者的概念都很陌生。Lagom 在 Cassandra 上的文档说要实现大约 9 个代码文件,我想确保我的数据库代码在将其传播到那么多代码之前可以正常工作。
具体来说,我目前正在尝试实现一个概念证明,以向/从 lagom 为您实现的 cassandra 数据库发送数据。到目前为止,我能够向/从数据库发送和检索数据,但是我无法返回该数据,因为这一切都是异步运行的,并且还返回了成功返回的数据。
我已经玩了一段时间了;检索代码如下所示:
override def getBucket(logicalBucket: String) = ServiceCall[NotUsed, String] {
request => {
val returnList = ListBuffer[String]()
println("Retrieving Bucket " + logicalBucket)
val readingFromTable = "SELECT * FROM data_access_service_impl.s3buckets;"
//DB query
var rowsFuture: Future[Seq[Row]] = cassandraSession.selectAll(readingFromTable)
println(rowsFuture)
Await.result(rowsFuture, 10 seconds)
rowsFuture onSuccess {
case rows => {
println(rows)
for (row <- rows) println(row.getString("name"))
for (row <- rows) returnList += row.getString("name")
println("ReturnList: " + returnList.mkString)
}
}
rowsFuture onFailure {
case e => println("An error has occured: " + e.getMessage)
Future {"An error has occured: " + e.getMessage}
}
Future.successful("ReturnList: " + returnList.mkString)
}
}
当它运行时,我在 onSuccess 回调中将预期的数据库值设置为“println”。但是,我在 return 语句中使用的同一个变量在回调之外打印为空(并且也返回空数据)。这也发生在我使用的“插入”函数中,它并不总是返回我在回调函数中设置的变量。
如果我尝试将语句放在回调函数中,则会收到“返回单元,期望未来 [字符串]”的错误。所以我被困在无法从回调函数中返回的地方,所以我不能保证我正在返回数据)。
我的目标是向 API 返回一个字符串,以便它显示数据库中所有 s3 存储桶名称的列表。这意味着遍历 Future[Seq[Row]] 数据类型,并将数据保存到连接字符串中。如果有人可以提供帮助,他们将解决我通过 Lagom、Akka、Datastax 和 Cassandra 文档阅读的 2 周的问题。在这一点上我大吃一惊(信息超载),我没有找到明确的指南。
作为参考,这里是 cassandraSession 文档:
LagomTutorial/Documentation Style Information 及其唯一的 cassandra-query 示例 CassandraSession.scala 代码