scala – 我的http请求在Akka未来变为null
发布时间:2020-12-16 18:22:24 所属栏目:安全 来源:网络整理
导读:我的服务器应用程序使用 Scalatra,json4s和Akka. 它收到的大多数请求都是POST,它们会立即返回给客户端并返回固定响应.实际响应以异步方式发送到客户端的服务器套接字.为此,我需要从http请求中获取getRemoteAddr.我正在尝试使用以下代码: case class MyJsonP
我的服务器应用程序使用
Scalatra,json4s和Akka.
它收到的大多数请求都是POST,它们会立即返回给客户端并返回固定响应.实际响应以异步方式发送到客户端的服务器套接字.为此,我需要从http请求中获取getRemoteAddr.我正在尝试使用以下代码: case class MyJsonParams(foo:String,bar:Int) class MyServices extends ScalatraServlet { implicit val formats = DefaultFormats post("/test") { withJsonFuture[MyJsonParams]{ params => // code that calls request.getRemoteAddr goes here // sometimes request is null and I get an exception println(request) } } def withJsonFuture[A](closure: A => Unit)(implicit mf: Manifest[A]) = { contentType = "text/json" val params:A = parse(request.body).extract[A] future{ closure(params) } Ok("""{"result":"OK"}""") } } withJsonFuture函数的目的是将一些样板移出路径处理. 这有时可行(打印请求的非空值),有时请求为空,我觉得很令人费解.我怀疑我将来必须“关闭”这个请求.但是,当没有其他请求发生时,在受控测试方案中也会发生错误.我会想象请求是不可变的(也许我错了?) 为了解决这个问题,我已将代码更改为以下内容: case class MyJsonParams(foo:String,bar:Int) class MyServices extends ScalatraServlet { implicit val formats = DefaultFormats post("/test") { withJsonFuture[MyJsonParams]{ (addr,params) => println(addr) } } def withJsonFuture[A](closure: (String,A) => Unit)(implicit mf: Manifest[A]) = { contentType = "text/json" val addr = request.getRemoteAddr() val params:A = parse(request.body).extract[A] future{ closure(addr,params) } Ok("""{"result":"OK"}""") } } 这似乎有效.但是,我真的不知道它是否仍然包含任何可能导致未来错误的与并发相关的错误编程实践(“未来”意味着最常见的意义=未来的问题:). 解决方法
我不知道Scalatra,但是你正在访问一个你没有自己定义的请求值,这很可疑.我的猜测是,它是扩展ScalatraServlet的一部分.如果是这种情况,则可能是可变状态,它在请求开始时设置(由Scalatra设置),然后在结束时无效.如果发生这种情况,那么您的解决方法是可以的,因为在将来的块之前将请求分配给另一个val,例如val myRequest = request,然后在未来和关闭内部将其作为myRequest访问.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |