簡體   English   中英

如何在Webservice中保持客戶端和服務器連接處於活動狀態以進行StreamingOutput

[英]How to keep the client and server connection alive in webservice for StreamingOutput

我的網絡服務代碼

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,但是為什么沒有進行流傳輸來保持連接有效呢? 同樣,如果我們繞過代理,那么我們可以從Web服務成功獲取數據。

但是我們無法更改代理設置,並且我們需要在使用或不使用代理的情況下使用該應用程序。

您的代理服務器很可能會在配置的超時后簡單地終止連接,無論您是否正在傳輸數據。 如果您想知道, Connection: keep-alive標頭僅指示可以將同一連接重用於多個請求/響應( RFC7230 ),則不應控制單個連接的超時。

嘗試與您的代理管理員聯系:

  • 設置代理可以理解的標頭(也許Keep-alive: timeout=10000 ,但也可能完全不同,或者根本不可能)
  • 增加代理超時配置

如果仍然無法解決問題,那么您可能需要重新考慮設計並采用其他方法,例如Spring Data +可分頁的資源,或者,如果您覺得很勇敢,可以使用Spring Integration + Splitter模式進行異步處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM