1

接続が持続する場合、Apache HttpComponents のみを使用して、「接続: キープアライブ」および「キープアライブ: タイムアウト = x、最大 = y」ヘッダーを応答に追加するにはどうすればよいですか?

HttpComponents は、この接続が永続的ではないと判断した場合、応答を返した後に "Connection: close" ヘッダーを追加します。この場合、Keep-Alive ヘッダーは必要ありません。

私がこれをしている理由:

標準的な動作は、HttpComponents が永続的な接続の応答で何も変更せず、非永続的な接続に対して "Connection: close" を追加することです。これは、ほとんどの場合にうまく機能します。

標準の java.net.HttpURLConnection に基づくクライアントは、サーバーからの前の応答に Keep-Alive ヘッダーがない限り、非アクティブ状態が 5 秒間続くとタイムアウトになり、接続を破棄するため、Keep-Alive ヘッダーが必要です。Keep-Alive を使用して、5 秒よりも長いタイムアウトを定義したいと考えています。

4

2 に答える 2

1

org.apache.http.protocol.ResponseConnControl からの評価に応じて、"Connection: Keep-Alive" ヘッダーと "Keep-Alive: timeout=x, max=y" ヘッダーを応答に追加する HttpResponseInterceptor を追加できます。 Connection: close" ヘッダー、必要に応じて。

class ResposeKeepAliveHeaderMod implements HttpResponseInterceptor {

    @Override
    public void process(HttpResponse response, HttpContext context)
            throws HttpException, IOException {
        final Header explicit = response.getFirstHeader(HTTP.CONN_DIRECTIVE);
        if (explicit != null && HTTP.CONN_CLOSE.equalsIgnoreCase(explicit.getValue())) {
            // Connection persistence explicitly disabled
            return;
        }else{
            // "Connection: Keep-Alive" and "Keep-Alive: timeout=x, max=y" 
            response.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_KEEP_ALIVE);
            response.setHeader(HTTP.CONN_KEEP_ALIVE, "timeout=30, max=100");
        }

    }      
   }

ResponseConnControl の後に、これを HttpProcessor に追加する必要があります。

HttpProcessor httpProcessor = HttpProcessorBuilder.create()
            //.addFirst(new RequestTrace())
            .add(new ResponseDate())
            //.add(new ResponseServer("MyServer-HTTP/1.1"))
            .add(new ResponseContent())
            .add(new ResponseConnControl())
            .addLast(new ResposeKeepAliveHeaderMod())
            .build();

次に、サーバーを構築します。

final HttpServer server = ServerBootstrap.bootstrap()
            .setListenerPort(9090)
            .setHttpProcessor(httpProcessor)
            .setSocketConfig(socketConfig)
            .setExceptionLogger(new StdErrorExceptionLogger ())
            .setHandlerMapper(handle_map)
            .create();
于 2016-03-28T15:18:22.630 に答える
0

私はこれを試していませんが、httpCleint のカスタム 'ConnectionKeepAliveStrategy' をコーディングできるようです。ここにドキュメントがありますHttpComponents Custom stratagey

セクション 2.11 を参照

于 2012-01-07T13:14:14.277 に答える