我正在与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
答案 0 :(得分:3)
请参阅https://github.com/akka/akka-http/issues/745#issuecomment-271571342
简而言之,如果您需要两次解组实体,则应首先使用toStrict以确保整个实体在内存中缓冲,否则它将在第一次解组过程中耗尽,而第二次无法使用。
如果实体足够小以至于它适合akka的内部缓冲区,那么只有偶然地它才会在没有严格的情况下工作,那么实际上并没有耗尽。
答案 1 :(得分:0)
请注意,某些指令会强制执行隐式
toStrict
操作 作为entity(as[String])
和类似的。