我正在使用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 实体的服务器端处理