Reactor.netty.http.client.HttpClient作为构建器以使用不同的配置创建多个功能

问题描述

在这里,我正在使用HttpClient创建一个Web客户端构建器。如何创建HttpClient构建器以在同一httpclient上配置多个配置。例如:在一个函数中,我使用代理创建httpClient,在第二个示例中使用代理和安全性创建。因此,我调用了第一个代理功能,该功能先在httpclient对象之上应用代理,然后再应用安全性,以获得具有代理和安全性的htttpclient对象。但是它没有按预期工作。相反,我遇到了错误

(((TcpClientConnect)((TcpClientBootstrap)((HttpTcpClient)((HttpClientConnect)httpClient).defaultClient).defaultClient).source).provider =找不到本地变量'httpClient'

任何人都可以帮助解决此问题吗?

Class WebClientBuilderConfig{  
  private HttpClient httpClient;
   @Autowired
    private ConfigProperties configProperties;

    public WebClientBuilderConfig() {
        this.httpClient = HttpClient.create();
    }


    public WebClient.Builder webClientBuilderWithProxy() {
        Function<String,String> httpsProxyPassword = username -> configProperties.getHttpsProxyPassword();
        this.httpClient.tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,configProperties.getTcpTimeout())
                .doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(configProperties.getTcpTimeout(),TimeUnit.MILLISECONDS)))
                .proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
                        .host(configProperties.getHttpsProxyHost())
                        .port(configProperties.getHttpsProxyPort())
                        .nonProxyHosts(configProperties.getHttpsNonProxyHost())
                        .username(configProperties.getHttpsProxyUser())
                        .password(httpsProxyPassword)))
                .wiretap(configProperties.getTcpWireTap());
        return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient));
    }

    public WebClient.Builder webClientBuilderWithSSL() {
        **this.webClientBuilderWithProxy();**
        // truststore
        try {
            KeyStore trustStore = KeyStore.getInstance(configProperties.getTrustStoreType());
            trustStore.load(new FileInputStream((ResourceUtils.getFile(configProperties.getTrustStorePath()))),configProperties.getTrustStorePassword().tochararray());

            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(trustStore);

            SslContext sslContext = SslContextBuilder.forClient().trustManager(trustManagerFactory).build();

            httpClient.secure(spec -> spec.sslContext(sslContext));
        } catch (Exception e) {
            log.warn("Unable to set SSL Context",e);
        }

        return WebClient.builder().clientConnector(new ReactorClientHttpConnector(this.httpClient));
    }

解决方法

配置HttpClient时,您总是会收到一个新实例,因此在示例中,您应该执行以下操作:

    public WebClient.Builder webClientBuilderWithProxy() {
    Function<String,String> httpsProxyPassword = username -> configProperties.getHttpsProxyPassword();
    HttpClient localClient = this.httpClient.tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,configProperties.getTcpTimeout())
            .doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(configProperties.getTcpTimeout(),TimeUnit.MILLISECONDS)))
            .proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
                    .host(configProperties.getHttpsProxyHost())
                    .port(configProperties.getHttpsProxyPort())
                    .nonProxyHosts(configProperties.getHttpsNonProxyHost())
                    .username(configProperties.getHttpsProxyUser())
                    .password(httpsProxyPassword)))
            .wiretap(configProperties.getTcpWireTap());
    return WebClient.builder().clientConnector(new ReactorClientHttpConnector(localClient));
}