gpt4 book ai didi

scala - 我的 http 请求在 Akka future 中变为空

转载 作者:行者123 更新时间:2023-12-04 22:32:27 25 4
gpt4 key购买 nike

我的服务器应用程序使用 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 函数的目的是将一些样板文件移出我的路由处理。

这有时有效(为 request 打印一个非空值),有时 request 为空,我觉得这很令人费解。我怀疑我将来必须“关闭” request。但是,当没有其他请求正在进行时,该错误也会发生在受控测试场景中。我想 request 是不可变的(也许我错了?)

为了解决这个问题,我已将代码更改为以下内容:
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"}""")
}
}

这似乎有效。但是,我真的不知道它是否仍然包含任何可能在 future 导致错误的与并发相关的不良编程实践(“ future ”的意思是最常见的 = future :)。

最佳答案

我不知道 Scalatra,但是您访问一个您没有定义自己的名为 request 的值是可疑的。我的猜测是它是扩展 ScalatraServlet 的一部分。如果是这种情况,那么它可能是可变状态,它在请求开始时(由 Scalatra)设置,然后在结束时无效。如果发生这种情况,那么您的解决方法是可以的,因为在 request 块之前将 val myRequest = request 分配给另一个 val,例如 future,然后在 future 和闭包中将其作为 myRequest 访问。

关于scala - 我的 http 请求在 Akka future 中变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17450281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com