如何使用Netty4ClientHttpRequestFactory为Spring AsyncRestTemplate设置代理?

时间:2016-09-09 20:48:27

标签: java spring netty kotlin

当我将SimpleRequestFactory与AsyncRestTemplate一起使用时,我可以轻松配置HTTP代理服务器。

我可以这样做(Kotlin中的示例代码):

@Bean
open fun asyncRestTemplate(): AsyncRestTemplate {
    val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("127.0.0.1", 8008))

    val requestFactory = SimpleClientHttpRequestFactory().apply {
        this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
        this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
        this.setProxy(proxy)
        this.setTaskExecutor(taskExecutor())
    }

    return AsyncRestTemplate(requestFactory)
}

或者我可以简单地设置相应的系统属性:-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8008

但是,在我从SimpleClientHttpRequestFactory切换到Netty4ClientHttpRequestFactory的那一刻,没有明显的方法直接配置代理,看起来这个客户端也不尊重系统属性。

val requestFactory = Netty4ClientHttpRequestFactory().apply {
    this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
    this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
    //this.setProxy(proxy) //???
}

一旦我更改了netty客户端,我就不知道如何让它通过代理。

我对使用netty客户端的兴趣是我不仅想要发出异步请求,而且我希望这是非阻塞的。我希望我在这里做出错误的假设。

有没有人知道如何在使用Netty4ClientHttpRequestFactory时使用代理服务器,或者知道我可以使用Spring支持的替代非阻塞客户端?

1 个答案:

答案 0 :(得分:2)

Netty4ClientHttpRequestFactorysource)和相关类(例如Netty4ClientHttpRequestsource)使用SimpleChannelInboundHandler作为频道,不使用代理处理程序。一切都是私密的,无法在源代码中被覆盖,因此无法更改它以支持代理。你几乎要改写整个事情。

您有其他异步客户端选项可以很好地工作,并允许您更多配置选项。无论如何,包含的Netty是相当基本的。 OkHttpClientHttpRequestFactoryHttpComponentsAsyncClientHttpRequestFactory都允许您传入自己配置的客户端。