Akka http -ERROR :如果有效负载大小增加,则无法多次具体化子流源



我正在使用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 调用中取消编组两个条目,当我的 json 有效载荷 id 小(即几个字节)时,它就可以正常工作,一旦有效载荷大小增加,即大约 10-20 kb,它会抛出错误:

Substream Source cannot be materialized more than once

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

简而言之,如果您需要取消封送实体两次,则应首先使用 toStrict 来确保整个实体缓冲在内存中,否则它将被第一个解组过程耗尽,并且不适用于第二个。

只是偶然地,如果实体足够小,可以容纳在 akka 的内部缓冲区中,那么它才碰巧在没有 toStrict 的情况下工作,那么实际上不涉及排水。

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

请参阅 AKKA 文档:流式处理 HTTP 实体的服务器端处理

最新更新