Open Liberty上MicroProfile Rest Client连接池配置调整问题
Open Liberty JAX-RS实现版本说明
Open Liberty 22.0.0.9中,restfulWS-3.0(对应JAX-RS 3.0)默认采用RESTEasy作为底层实现,但jaxrs-2.0和jaxrs-2.1特性仍保留Apache CXF作为底层实现。你的场景中底层是org.apache.cxf.microprofile.client.CxfTypeSafeClientBuilder,说明当前使用的是基于jaxrs-2.x的MicroProfile Rest Client实现,底层确实是CXF。
连接池调整可行方案
方案1:通过MicroProfile Config全局配置
CXF的MicroProfile Rest Client实现支持通过MicroProfile Config属性配置连接池参数,直接在src/main/resources/META-INF/microprofile-config.properties中添加以下配置:
# 全局最大总连接数 mp.rest.client.connection.pool.max.total=100 # 每目标路由的最大连接数 mp.rest.client.connection.pool.max.per.route=50
该配置对所有MicroProfile Rest Client生效,无需修改代码,是最简便的方式。
方案2:通过RestClientBuilderListener自定义特定客户端配置
如果需要针对单个Rest Client做精细化配置,可实现RestClientBuilderListener来修改CXF的HTTP Conduit参数:
- 实现监听器类:
import org.apache.cxf.microprofile.client.CxfTypeSafeClientBuilder; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transport.http.httpclient.HttpClientPolicy; import org.eclipse.microprofile.rest.client.RestClientBuilder; import org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener; public class CxfRestClientConfigListener implements RestClientBuilderListener { @Override public void newBuilder(RestClientBuilder builder) { if (builder instanceof CxfTypeSafeClientBuilder) { CxfTypeSafeClientBuilder cxfBuilder = (CxfTypeSafeClientBuilder) builder; // 配置HTTP Conduit cxfBuilder.configureConduit(conduit -> { HTTPConduit httpConduit = (HTTPConduit) conduit; HttpClientPolicy clientPolicy = httpConduit.getClient(); // 设置最大总连接数 clientPolicy.setMaxConnections(100); // 设置每路由最大连接数 clientPolicy.setMaxConnectionsPerRoute(50); // 可选:设置连接超时、读取超时 clientPolicy.setConnectionTimeout(5000); clientPolicy.setReceiveTimeout(10000); httpConduit.setClient(clientPolicy); }); } } }
- 注册监听器:在
src/main/resources/META-INF/services目录下创建文件org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener,内容为监听器类的全限定名:
com.yourpackage.CxfRestClientConfigListener
该方式会在所有RestClient构建时触发,可根据需要添加条件判断,仅对特定客户端生效。
方案3:接口级配置(针对单个客户端)
在MicroProfile Rest Client接口上直接指定配置属性,实现单个客户端的独立配置:
import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @RegisterRestClient(baseUri = "http://your-target-service") @ConfigProperty(name = "mp.rest.client.connection.pool.max.total", value = "100") @ConfigProperty(name = "mp.rest.client.connection.pool.max.per.route", value = "50") public interface YourCustomRestClient { @GET @Path("/api/data") String fetchData(); }
注意该方式需要CXF的MicroProfile Rest Client实现支持接口级配置,Open Liberty 22.0.0.9对应的版本已支持。
关于-Dhttp.maxConnections无效的说明
-Dhttp.maxConnections是CXF传统JAX-RS客户端的全局配置参数,不适用于MicroProfile Rest Client的CXF实现,因此该参数无法调整你的连接池大小。
内容的提问来源于stack exchange,提问作者Clément Honoré

