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