Как сохранить соединение клиента и сервера в веб-сервисе для StreamingOutput - PullRequest
0 голосов
/ 29 мая 2018

Код моего веб-сервиса

final StreamingOutput stream = new StreamingOutput() {
  @Override
  public void write(final OutputStream out) {
    dao.getData(
        query,
        new SdmxObserver(writerFactory.getDataWriter(sdmxFormat, out, properties), request
            .getRemoteAddr(), request.getHeader("User-Agent"), query.toString(), sdmxFormat
            .toString(), query.getlist()));
  }
};
res = Response.ok(stream, MediaType.valueOf("application/vnd.sdmx.genericdata+xml;version=2.1"))
                .cacheControl(cc).lastModified(lastModified).header("Vary", "Accept,Accept-Encoding").build();
return res;

Вызов базы данных для извлечения данных занимает много времени, поэтому, когда мы используем прокси-сервер, у него есть время, превышающее 2 минуты и, следовательно, поскольку данные не поступают из базы данныхЧерез 2 минуты он показывает время ожидания соединения.Хотя мы использовали StreamingOutput, почему потоковая передача не происходит, чтобы поддерживать соединение живым?Также, если мы обойдем прокси, то сможем успешно получить данные из веб-службы.

Но мы не можем изменить настройку прокси, а также нам нужно использовать приложение с прокси или без него.

1 Ответ

0 голосов
/ 29 мая 2018

Скорее всего, ваш прокси-сервер просто уничтожит соединение по истечении заданного времени ожидания независимо от того, передаете вы данные или нет.Если вам интересно, заголовок Connection: keep-alive указывает только на то, что одно и то же соединение может быть повторно использовано для нескольких запросов / ответов ( RFC7230 ), он не должен контролировать время ожидания для одного соединения.

Попробуйте поговорить со своим прокси-администратором о:

  • настройке заголовков, которые понимает прокси-сервер (возможно, Keep-alive: timeout=10000, но может также быть чем-то совершенно иным или вообще невозможным)
  • увеличение конфигурации тайм-аута прокси

Если это не сработает, вам может понадобиться переосмыслить свой дизайн и использовать другой подход, например Spring Data + ресурсы для вывода страниц или, если вы чувствуете себя смелым, асинхронную обработку с Spring Integration + Splitter pattern .

...