Как передать файл в rxjava, не затрагивая память

#java #java-stream #filestream #vert.x

#java #java-stream #filestream #vert.x

Вопрос:

У меня есть требование, подобное приведенному ниже.

  1. Моему приложению необходимо вызвать API, который возвращает ответ в виде двоичных данных (файлы PDF или изображений размером менее 30 МБ).
  2. Как только я получу двоичный ответ, мне нужно подготовить объект json с некоторыми другими элементами и вызвать 2nd api (этот api не поддерживает потоковую передачу) для обработки запроса.

Проблема здесь, на шаге 1, заключается в том, что если я получаю большой файл, например, 10 или 20 МБ двоичных данных, память сервера становится занятой. Я не могу выполнять потоковую передачу после чтения файла с шага 1 по шаг 2, поскольку 2-й API не поддерживает потоковую передачу. Какие у нас есть варианты, чтобы потреблять меньше памяти и отправлять json во 2-й API? Мы используем vert x и реактивную java. Пожалуйста, предложите.

Комментарии:

1. Я не думаю, что есть какие- либо другие варианты. Помимо изменения требований или ограничений.

2. Это зависит от того, как вы получите свой ответ и может ли построение JSON начаться без полного завершенного ответа от API1. Если нет, другого способа нет — вы должны сохранить весь первый ответ в памяти.

3. Конструкция JSON с другими элементами уже доступна перед вызовом step1, но только один элемент зависит от ответа от step1. API step2 ожидает все элементы вместе.

4. Как вы отправляете двоичный файл в полезной нагрузке JSON во 2-й API в кодировке base64? Какой клиент вы используете HttpClient или WebClient ? Пожалуйста, добавьте несколько фрагментов, иначе вопрос остается неопределенным, чтобы на него можно было ответить правильно.

5. да, мы кодируем base64 и используем веб-клиент rxjava.