Составные ошибки формы с Lagom

Большинство наших точек входа в Lagom не используют многокомпонентные запросы формы, а один. Поскольку в настоящее время Lagom изначально не поддерживает многочастные запросы, общее предложение, которое я видел, состоит в том, чтобы вызывать базовый API-интерфейс Play, используя механизм PlayServiceCall.

Мы сделали это, и это работает - большую часть времени. Но мы испытываем периодические ошибки, особенно при отправке больших файлов. Это всегда случаи 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
  }
}

Вот только два примера исключений, которые мы видим:

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.

Мы используем Lagom 1.3.8, в Scala. Любые предложения, пожалуйста?

1 ответ

Решение

Попробуйте использовать новый сервисный шлюз на основе Akka HTTP.

Вы можете включить это, добавив следующее к вашему build.sbt:

lagomServiceGatewayImpl in ThisBuild := "akka-http"

Новый сервисный шлюз по-прежнему отключен по умолчанию в Lagom 1.3.8, но пользователи Lagom, столкнувшиеся с этой проблемой, сообщили, что она решена путем включения akka-http шлюз. Это станет реализацией по умолчанию в Lagom 1.4.0.

Другие вопросы по тегам