开发者社区 问答 正文

使用JaxRsClientFactory创建代理时,如何设置连接池大小/最大连接数?

我正在使用JaxRSClientFactory为我的API创建代理客户端。代码如下:

final MyApi api = JAXRSClientFactory.create(url, MyApi.class,
            Collections.singletonList(new JacksonJaxbJsonProvider(new ObjectMapper(), new Annotations[] {Annotations.JACKSON})) )
    ;

    WebClient.client( api ).header( "Authorization", auth ).header("User-Agent", "MyService");
    WebClient.getConfig( api ).getHttpConduit().getClient().setReceiveTimeout( readTimeout );
    WebClient.getConfig( api ).getHttpConduit().getClient().setConnectionTimeout(connectTimeout);
    WebClient.getConfig( api ).getHttpConduit().getClient().setConnection( ConnectionType.KEEP_ALIVE);
    WebClient.client( api ).accept( MediaType.APPLICATION_JSON_TYPE );
    WebClient.client( api ).type( MediaType.APPLICATION_JSON_TYPE );

如何设置连接池大小或此处允许的最大连接数?我在网上找到了Jersey RestEasyClient的样本,但没有找到任何用于Client构建的样本JAXRSClientFactory。

有人对此有任何想法吗?

展开
收起
垚tutu 2019-11-28 18:23:01 856 分享 版权
阿里云 AI 助理回答

在使用Apache CXF的JAXRSClientFactory创建客户端时,直接通过API设置连接池大小或最大连接数并不直观,因为CXF默认使用的HTTPConduit配置并没有直接暴露这些参数。但是,你可以通过自定义HTTPConduit的配置来实现这一需求,具体可以通过以下步骤进行:

  1. 创建自定义HTTPConduitConfigurer:首先,你需要创建一个实现了HTTPConduitConfigurer接口的类,该类允许你自定义HTTPConduit的行为。
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.ConnectionType;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

public class CustomHTTPConduitConfigurer implements HTTPConduitConfigurer {

    private int maxConnections = 200; // 自定义的最大连接数
    private long receiveTimeout = 30000L; // 自定义接收超时时间
    private long connectionTimeout = 30000L; // 自定义连接超时时间

    @Override
    public void configure(String name, String address, HTTPConduit conduit) {
        HTTPClientPolicy clientPolicy = new HTTPClientPolicy();
        clientPolicy.setConnectionTimeout(connectionTimeout);
        clientPolicy.setReceiveTimeout(receiveTimeout);
        clientPolicy.setMaxConnections(maxConnections); // 设置最大连接数
        conduit.setClient(clientPolicy);

        TLSClientParameters tlsParams = conduit.getTlsClientParameters();
        if (tlsParams == null) {
            tlsParams = new TLSClientParameters();
            conduit.setTlsClientParameters(tlsParams);
        }
        // 可以在这里添加TLS相关的配置,如信任库、密钥库等

        conduit.getClient().setConnection(ConnectionType.KEEP_ALIVE);
    }
}
  1. 注册自定义Configurer:然后,在创建客户端之前,需要将这个自定义的HTTPConduitConfigurer注册到CXF的Bus上,这样它就会应用到所有通过该Bus创建的HTTPConduit上。
import org.apache.cxf.bus.CXFBus;
import org.apache.cxf.bus.spring.SpringBusFactory;
import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;

public class ClientSetup {
    public static void main(String[] args) {
        SpringBusFactory bf = new SpringBusFactory();
        CXFBus bus = bf.createBus();
        bus.getInInterceptors().add(new LoggingInInterceptor());
        bus.getOutInterceptors().add(new LoggingOutInterceptor());

        // 注册自定义的HTTPConduitConfigurer
        bus.setExtension(new CustomHTTPConduitConfigurer(), HTTPConduitConfigurer.class);

        JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
        bean.setAddress("http://your-api-url");
        bean.setServiceClass(MyApi.class);
        bean.setBus(bus); // 关键步骤,将自定义配置的Bus应用到客户端工厂

        MyApi api = bean.create();
        
        // 其他WebClient配置保持不变
        WebClient.getConfig(api).getHttpConduit().getClient().setReceiveTimeout(receiveTimeout);
        WebClient.getConfig(api).getHttpConduit().getClient().setConnectionTimeout(connectionTimeout);
        WebClient.getConfig(api).getHttpConduit().getClient().setConnection(ConnectionType.KEEP_ALIVE);
        WebClient.client(api).accept(MediaType.APPLICATION_JSON_TYPE);
        WebClient.client(api).type(MediaType.APPLICATION_JSON_TYPE);
    }
}

请注意,上述代码示例中使用了SpringBusFactory来创建CXF的Bus实例,并且展示了如何将自定义的HTTPConduitConfigurer注册到Bus上。这确保了你的连接池大小和最大连接数设置能够生效。根据你的实际项目环境,可能需要调整这部分逻辑以适应不同的依赖管理和配置方式。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
API
问答地址: