Spring5.1开始,WebFlux的WebClient支持连接池功能了。
默认情况下,WebClient使用global Reactor Netty资源,也可以不使用全局资源:
@Bean
ReactorResourceFactory resourceFactory() {
ReactorResourceFactory factory = new ReactorResourceFactory();
factory.setUseGlobalResources(false);
factory.setConnectionProvider(ConnectionProvider.fixed("httpClient", maxConns, acquireTimeout));
factory.setLoopResources(LoopResources.create("httpClient", workCounts, true));
return factory;
}
可以这样配置WebClient:
@Bean
WebClient webClient() {
Function<HttpClient, HttpClient> mapper = client ->
client.tcpConfiguration(c ->
c.option(CONNECT_TIMEOUT_MILLIS, connTimeout)
.option(TCP_NODELAY, true)
.doOnConnected(conn -> {
conn.addHandlerLast(new ReadTimeoutHandler(readTimeout));
conn.addHandlerLast(new WriteTimeoutHandler(writeTimeout));
}));
ClientHttpConnector connector =
new ReactorClientHttpConnector(resourceFactory(), mapper);
return WebClient.builder().clientConnector(connector).build();
}
测试一下:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@ActiveProfiles("constants")
public class WebClientTest {
@Autowired
private WebClient client;
private static String blog = "https://blog.csdn.net/weixin_43364172";
private static String weibo = "http://www.weibo.com";
@Test
public void test() {
single(blog);
}
private void single(String url) {
Mono<ClientResponse> mono = client.get().uri(url)
.accept(MediaType.TEXT_HTML)
.exchange();
StepVerifier.create(mono)
.assertNext(clientResponse -> {
Assert.assertThat(clientResponse.statusCode(),
anyOf(equalTo(OK), equalTo(MOVED_PERMANENTLY)));
if (clientResponse.rawStatusCode() == OK.value(