使用Lagom的多部分表单错误

sil*_*rry 3 scala multipartform-data playframework lagom

我们的大多数Lagom入口点都不使用多部分表单请求,但有一个请求.由于Lagom当前不支持多部分请求,因此我看到的一般建议是使用PlayServiceCall机制调用底层Play API.

我们已经做到了,而且大部分时间都有效.但我们遇到间歇性错误,尤其是在提交大型文件时.这些总是java.util.zip.ZipException(各种类型)的情况,看起来好像没有收到整个文件进行处理.

以下是入口点在代码中的外观; 特别是Play包装机制:

def upload = PlayServiceCall[NotUsed, UUID] {
  wrapCall => Action.async(multipartFormData) {
    request => wrapCall(ServiceCall { _ =>
      val upload = request.body.file("upload")
      val input = new FileInputStream(upload.get.ref.file)
      val filename = upload.get.filename
      // ...
      // other code to actually process the file
      // ...
    })(request).run
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是我们看到的两个例外情况:

Caused by: java.util.zip.ZipException: invalid code lengths set
  at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
  at java.util.zip.ZipInputStream.read(ZipInputStream.java:194)
  at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:214)
  at java.io.FilterInputStream.read(FilterInputStream.java:107)
  etc.

Caused by: java.util.zip.ZipException: invalid distance too far back
  at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
  at java.util.zip.ZipInputStream.read(ZipInputStream.java:194)
  at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:214)
  at java.io.FilterInputStream.read(FilterInputStream.java:107)
  etc.
Run Code Online (Sandbox Code Playgroud)

我们在Scala中使用Lagom 1.3.8.有什么建议吗?

Tim*_*ore 6

尝试使用基于Akka HTTP的新服务网关.

您可以通过添加以下内容来启用此功能build.sbt:

lagomServiceGatewayImpl in ThisBuild := "akka-http"
Run Code Online (Sandbox Code Playgroud)

默认情况下,在Lagom 1.3.8中仍然禁用新的服务网关,但遇到此问题的Lagom用户报告已通过启用akka-http网关解决了该问题.这将成为Lagom 1.4.0中的默认实现.