Akka http -ERROR:如果Payload大小增加,则子流源不能多次实现

时间:2017-07-06 13:53:14

标签: scala rest akka akka-http

我正在与Akka Http合作,我已将路线定义为

val route = (path(HttpConstants.CreateJob) & post) {
    (entity(as[JobDetailsEntity]) & entity(as[JobEntity])) {
      (jobDetailsEntity: JobDetailsEntity, jobEntity: JobEntity) =>
        val updatedJobEntity = jobEntity.copy(runningSince = DateTime.now().getMillis)
        val updatedJobDetailsEntity = jobDetailsEntity.copy(runningSince = DateTime.now().getMillis).copy(modify_date = DateTime.now().getMillis)
        complete {
          createJobDetails(updatedJobDetailsEntity).map(_.asJson)
          createJob(updatedJobEntity).map(_.asJson)
        }
    }

在这里,我试图在同一个POST调用中解组两个entite,当我的json Payload id很小,即几个字节,然后它工作正常,一旦有效载荷大小增加,即大约10-20 kb它抛出错误:< / p>

Substream Source cannot be materialized more than once

2 个答案:

答案 0 :(得分:3)

请参阅https://github.com/akka/akka-http/issues/745#issuecomment-271571342

简而言之,如果您需要两次解组实体,则应首先使用toStrict以确保整个实体在内存中缓冲,否则它将在第一次解组过程中耗尽,而第二次无法使用。

如果实体足够小以至于它适合akka的内部缓冲区,那么只有偶然地它才会在没有严格的情况下工作,那么实际上并没有耗尽。

答案 1 :(得分:0)

  

请注意,某些指令会强制执行隐式toStrict操作   作为entity(as[String])和类似的。

请参阅AKKA文档:Server-Side handling of streaming HTTP Entities