【问题标题】:reactor.netty.http.client.HttpClient as builder to create multiple function with different configsreactor.netty.http.client.HttpClient 作为构建器来创建具有不同配置的多个功能
【发布时间】:2021-01-05 03:21:24
【问题描述】:

在这里,我正在使用 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));
    }

【问题讨论】:

    标签: spring-webclient reactor-netty


    【解决方案1】:

    当您配置 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));
    }
    

    【讨论】:

    • 如果它总是创建本地实例,那么我不能在第二个函数中使用它(第一个乐趣),对吗?
    • 所以我必须再次为代理配置编写代码。
    • 那你为什么不把构造函数中的公共部分移动一下呢?
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多