我是一个没有经验的喷雾/ scala开发人员,我正在尝试正确使用spray.io LruCache。我想要实现一些非常简单的事情。我有一个kafka消费者,当它从主题中读取内容时,我希望它将其读取的值放入缓存中。 然后在其中一个路由中我想读取这个值,值是字符串类型,我现在看到的内容如下:
object MyCache {
val cache: Cache[String] = LruCache(
maxCapacity = 10000,
initialCapacity = 100,
timeToLive = Duration.Inf,
timeToIdle = Duration(24, TimeUnit.HOURS)
)
}
将某些内容放入缓存我使用以下代码:
def message() = Future { new String(singleMessage.message()) }
MyCache.cache(key, message)
然后在其中一条路线中,我试图从缓存中获取一些东西:
val res = MyCache.cache.get(keyHash)
问题是res的类型是Option [Future [String]],在这种情况下访问实际值是相当困难和丑陋的。请问有人可以告诉我如何简化我的代码以使其更好,更具可读性? 提前谢谢。
答案 0 :(得分:1)
不要试图从未来获得价值。而是调用Future上的map
来安排在Future完成时对值进行的工作,然后用该结果完成请求(这本身就是Future)。看起来应该是这样的:
path("foo") {
complete(MyCache.cache.get(keyHash) map (optMsg => ...))
}
此外,如果singleMessage.message
没有进行I / O或以其他方式阻止,那么就像你一样创建未来
Future { new String(singleMessage.message) }
这样做会更有效:
Future.successful(new String(singleMessage.message))
后者只是创建一个已完成的Future,绕过使用ExecutionContext来评估函数。
如果singleMessage.message
执行I / O操作,那么理想情况下,您可以使用某些库(如Spray客户端,如果它是HTTP请求)执行I / O,返回Future(而不是使用Future { ... }
创建另一个将阻止的线程。