无法将消息返回给Spray HttpService Actor

时间:2013-12-09 16:59:50

标签: scala akka spray

我正在学习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代码并了解原因......提前致谢

1 个答案:

答案 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] }
      }
    }
}