Akka Scala 服务器中的 500 内部服务器错误

Posted

技术标签:

【中文标题】Akka Scala 服务器中的 500 内部服务器错误【英文标题】:500 Internal Server Error in Akka Scala server 【发布时间】:2017-05-31 05:44:31 【问题描述】:

这是我使用 Akka 框架编写的服务器代码:

case class Sentence(data: String)
case class RawTriples(triples: List[String])

trait Protocols extends DefaultJsonProtocol 
    implicit val sentenceRequestFormat = jsonFormat1(Sentence)
    implicit val rawTriplesFormat = jsonFormat1(RawTriples)


trait Service extends Protocols 
    implicit val system: ActorSystem
    implicit def executor: ExecutionContextExecutor
    implicit val materializer: Materializer

    val openie = new OpenIE
    def config: Config
    val logger: LoggingAdapter

    lazy val ipApiConnectionFlow: Flow[HttpRequest, HttpResponse, Any] =
        Http().outgoingConnection(config.getString("services.ip-api.host"), config.getInt("services.ip-api.port"))

    def ipApiRequest(request: HttpRequest): Future[HttpResponse] = Source.single(request).via(ipApiConnectionFlow).runWith(Sink.head)

    val routes = 
        logRequestResult("akka-http-microservice") 
            pathPrefix("openie") 
                post  
                    decodeRequest
                        entity(as[Sentence]) sentence =>
                            complete 
                                var rawTriples = openie.extract(sentence.data)
                                        val resp: MutableList[String] = MutableList()

                                for(rtrip <- rawTriples)
                                    resp += (rtrip.toString())
                                
                                val response: List[String] = resp.toList

                                println(response)
                                response
                            
                        
                    
                
            
        
    


object AkkaHttpMicroservice extends App with Service 
    override implicit val system = ActorSystem()
    override implicit val executor = system.dispatcher
    override implicit val materializer = ActorMaterializer()

    override val config = ConfigFactory.load()
    override val logger = Logging(system, getClass)

    Http().bindAndHandle(routes, config.getString("http.interface"), config.getInt("http.port"))

服务器接受一个包含句子POST请求,并返回一个json数组作为回报。它工作正常,但如果我使用并行代码过于频繁地向它发出请求,那么它会给出 500 内部服务器错误。我想知道是否可以在服务器中设置任何参数来避免这种情况(接受请求的就绪线程数等)。

在日志文件中,错误记录为:

[错误] [05/31/2017 11:48:38.110] [default-akka.actor.default-dispatcher-6] [akka.actor.ActorSystemImpl(default)] 处理过程中的错误 请求:“空”。完成 500 内部服务器错误响应。

【问题讨论】:

查看服务器日志文件以获取更多信息 您是否获得了更完整的堆栈跟踪以在框架代码中进行调试? 【参考方案1】:

bindAndHandle 方法的文档显示了您想要的内容:

/**
 * Convenience method which starts a new HTTP server at the given endpoint and uses the given `handler`
 * [[akka.stream.scaladsl.Flow]] for processing all incoming connections.
 *
 * The number of concurrently accepted connections can be configured by overriding
 * the `akka.http.server.max-connections` setting. Please see the documentation in the reference.conf for more
 * information about what kind of guarantees to expect.
 *
 * To configure additional settings for a server started using this method,
 * use the `akka.http.server` config section or pass in a [[akka.http.scaladsl.settings.ServerSettings]] explicitly.
 */

akka.http.server.max-connections 可能是你想要的。正如文档建议的那样,您还可以深入了解akka.http.server 配置部分。

【讨论】:

我必须对application.conf 文件进行一些更改吗? 你能检查更新的问题吗?我添加了日志输出 是的,您可以在application.conf 中进行配置。根据您的更新,似乎是发送请求的代码有问题......至少服务器声称它正在接收null 请求或包含null 的请求。 但是在请求代码中我确保它不会发送空请求。【参考方案2】:

在 application.conf 文件中添加以下内容

akka.http 
  server 
    server-header = akka-http/$akka.http.version
    idle-timeout = infinite
    request-timeout = infinite
  

【讨论】:

@Nilesh 更改超时有什么帮助?

以上是关于Akka Scala 服务器中的 500 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

与 Scala / Akka Actor 相比,Java 线程有多重?

Scala如何使用akka actor有效地处理超时操作

如何让 Shiro 在 Scala + Akka + Spray 环境中工作

Akka-Http 中的实体是啥?

Scala中的Akka,感叹号和问号

Akka Scala 演员中的死信