Есть ли способ вызвать метод, когда «PoolingHttpClientConnectionManager» каждый раз создает соединение? - PullRequest
0 голосов

Я использую клиент Apache HTTP для реализации пула соединений HTTP и У меня есть требование вызывать метод каждый раз, когда пул соединений создает соединение. Я проверил, позволяет ли он переопределить метод, которыйсоздает связи, но это не так.Есть ли способ добиться этого?

    import org.apache.http.*;
    import org.apache.http.conn.ConnectionKeepAliveStrategy;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.client.TargetAuthenticationStrategy;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.protocol.HttpContext;
    import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;

    import java.util.concurrent.TimeUnit;

    public class PoolingConnectionFactory {

    public PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

     public CloseableHttpClient CreateHttpClient(PoolingHttpClientConnectionManager connManager) {

            CloseableHttpClient client = HttpClients.custom()
                    .setTargetAuthenticationStrategy(new AuthendictionSessionStrategy())
                    .setKeepAliveStrategy(strategy)
                    .setConnectionManager(connManager)
                    .build();

            return client;
        }

        public CloseableHttpClient getConnection(PoolingHttpClientConnectionManager connMan) {

            connMan.closeExpiredConnections(); //Close the expired http connections which are expired
            connMan.closeIdleConnections(50, TimeUnit.SECONDS);  //if http connection is idle for 50s then it will close
            CloseableHttpClient client = CreateHttpClient(connMan);
            return client;
        }
    }

1 Ответ

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

Есть несколько точек плагинов.Пользовательский код может вводиться либо на уровне фабрики сокетов, либо на уровне оператора соединения.

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
        new DefaultHttpClientConnectionOperator(
                RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", new PlainConnectionSocketFactory() {

                        @Override
                        public Socket connectSocket(
                                int connectTimeout,
                                Socket socket,
                                HttpHost host,
                                InetSocketAddress remoteAddress,
                                InetSocketAddress localAddress,
                                HttpContext context) throws IOException {
                            return super.connectSocket(connectTimeout, socket, host, remoteAddress, localAddress, context);
                        }
                    })
                    .register("https", new SSLConnectionSocketFactory(SSLContexts.createSystemDefault()) {

                        @Override
                        public Socket connectSocket(
                                int connectTimeout,
                                Socket socket,
                                HttpHost host,
                                InetSocketAddress remoteAddress,
                                InetSocketAddress localAddress,
                                HttpContext context) throws IOException {
                            return super.connectSocket(connectTimeout, socket, host, remoteAddress, localAddress, context);
                        }
                    })
                    .build(),
                DefaultSchemePortResolver.INSTANCE,
                SystemDefaultDnsResolver.INSTANCE) {

            @Override
            public void connect(
                    ManagedHttpClientConnection conn,
                    HttpHost host,
                    InetSocketAddress localAddress,
                    int connectTimeout,
                    SocketConfig socketConfig,
                    HttpContext context) throws IOException {
                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
            }
        },
        ManagedHttpClientConnectionFactory.INSTANCE,
        0L, TimeUnit.MILLISECONDS);
CloseableHttpClient client = HttpClients.custom()
        .setConnectionManager(cm)
        .build();
...