Как эффективно загрузить файл из остальных API и отправить его в брокер сообщений, как RabbitMq? - PullRequest
0 голосов
/ 09 апреля 2020

цель состоит в том, чтобы загрузить файл из URI и сопоставить его с существующей моделью данных. эта модель данных называется FileNode и имеет свойство типа InputStream (это InputStream представляет данные файла). Я не знаю, как это сделать. Я попытался использовать Spring RestTemplate, но он закрывает ответ InputStream в своем методе doExecute (все RestTemplate шаблонные методы в конечном итоге делегируются этому методу). затем я попытался расширить RestTemplate и прокомментировать код, закрывающий Response InputStream:

  @Override
  protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor) throws RestClientException {
    Assert.notNull(url, "URI is required");
    Assert.notNull(method, "HttpMethod is required");
    ClientHttpResponse response = null;
    try {
      ClientHttpRequest request = createRequest(url, method);
      if (requestCallback != null) {
        requestCallback.doWithRequest(request);
      }
      response = request.execute();
      handleResponse(url, method, response);
      return (responseExtractor != null ? responseExtractor.extractData(response) : null);
    }
    catch (IOException ex) {
      String resource = url.toString();
      String query = url.getRawQuery();
      resource = (query != null ? resource.substring(0, resource.indexOf('?')) : resource);
      throw new ResourceAccessException("I/O error on " + method.name() +
        " request for \"" + resource + "\": " + ex.getMessage(), ex);
    }
    finally {
      /**** when to close the response? can I use a proxy for the response's InputStream that closes this response when itself is closed?****/
      if(!(responseExtractor instanceof CloseableResponseExtractor)) //?!
      if (response != null) {
        response.close();
      }
    }
  }

, тогда я подумал, что это должен быть более простой способ, поэтому я отправил этот вопрос.

примечание: Я немедленно отправляю файл посреднику сообщений, то есть мне не нужно сохранять его в памяти. и я не думаю, что это хорошая идея, чтобы сохранить файл в памяти или на диске, а затем выполнить потоковую передачу оттуда, потому что размер файла может быть слишком большим, я не знаю! на самом деле мой код должен быть очень тонким слоем между инфраструктурой (устаревшие коды + брокер сообщений + ...) и остальным API, и я думаю, что если я сначала запишу его на диск, это сильно повлияет на время отклика (мне нужно написать и читать с диска!). Каковы ваши рекомендации?

Какова наилучшая практика для этого сценария и как обычно это делается?

спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...