我正在学习Spray和Akka。已经构建了一个简单的Spray路由应用程序,其中一个路由存根为 -
path("blog" / LongNumber) {
blogId =>
respondWithMediaType(MediaTypes.`application/json`) {
get {
request => BlogFetchActor ! Get(blogId)
}
}
}
在上面的代码中,我在我的喷涂路由定义中(在实现HttpService的类中)将消息分派给请求中具有ID(blogId)的另一个Actor。 BlogFetchActor应该从数据库中获取数据并响应发送者。我编码如下 -
def receive: Receive = LoggingReceive {
case Get(id: Long) => {
log.debug("Retrieving blog with id %d".format(id))
sender ! ReturnBlog(get(id))
}
}
来自路线的Actor消息正在转到我的BlogFetchActor。我的BlogFetchActor也完成了从数据库中获取数据的工作。但是当我尝试将响应发送回发件人HttpService,ReturnBlog消息时,它不起作用。该消息最终出现在DeadLetters中,我在日志中看到了以下内容 -
来自Actor的消息[in.bharathwrites.BlogFetchActor $ ReturnBlog] [akka:// on-spray-can / user / blog-service / blog#1301907662]给演员[akka:// on-spray-can / deadLetters ]没有交付。
为什么回复给发件人的回复不起作用?我究竟做错了什么?我怎么能做到这一点?我试过阅读Spray文档和ScalaDoc,但无法弄清楚问题。我不够精通阅读Spray代码并了解原因......提前致谢
答案 0 :(得分:7)
如果您想在完成请求之前询问其他演员,则应使用Akka's ask pattern(下例中的?
)。
您还可以考虑返回Option[ReturnBlog]
而不是ReturnBlog
,以便在此类博客不存在时允许Spray自动生成404
状态响应。
path("blog" / LongNumber) {
blogId =>
respondWithMediaType(MediaTypes.`application/json`) {
get {
complete { (BlogFetchActor ? Get(blogId)).mapTo[ReturnBlog] }
}
}
}