В проекте Java (only) Play 2.3 нам необходимо отправить не-chunked ответ InputStream
непосредственно клиенту. InputStream
поступает из удаленного сервиса, из которого мы хотим напрямую передать клиенту, без блокировки или буферизации в локальный файл. Так как мы знаем размер перед чтением входного потока, мы не хотим, чтобы был отрезанный ответ.Как отправить InputStream в рамки игры в проекте только java без фрагментированных ответов?
Каков наилучший способ возврата результата для входного потока с известным размером? (предпочтительнее без использования Scala).
При поиске по умолчанию метода ok(file, ..)
для возвращаемых объектов File он проникает в глубину встроенных игр, которые доступны только из scala, и использует контекст внутреннего исполнения, к которому невозможно получить доступ извне. Было бы неплохо, если бы он работал одинаково, только с InputStream
.
Вы не можете сделать это, без блокировки, с помощью Java. С другой стороны, вы можете сделать это, не записывая сначала локальный файл. – sebster
Ну, во-вторых, вы можете попробовать [реактивные потоки] (https://github.com/reactive-streams/reactive-streams-jvm/) и посмотреть, можете ли вы поместиться в коде. Это довольно avantgarde так ... – sebster
хорошо, ясно, что чтение из InputStream будет блокироваться, но я предполагаю, что клиентское соединение, обработанное netty, не должно блокироваться. если я использую буфер 4k, чтение 4k-буфера из этого InputStream будет блокировать, но я бы предположил, что после передачи этих 4k-буфера для воспроизведения фрейма высвободит поток .. (пока следующий буферный блок 4k не будет прочитан). Предполагается, что эта служба, откуда мы читаем InputStream, все еще намного быстрее, чем внешние клиенты (поскольку она живет в одной и той же инфраструктуре), поэтому большинство времени будет ждать клиента. – herbert