我正在使用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。
有人对此有任何想法吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Apache CXF的JAXRSClientFactory
创建客户端时,直接通过API设置连接池大小或最大连接数并不直观,因为CXF默认使用的HTTPConduit
配置并没有直接暴露这些参数。但是,你可以通过自定义HTTPConduit
的配置来实现这一需求,具体可以通过以下步骤进行:
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);
}
}
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上。这确保了你的连接池大小和最大连接数设置能够生效。根据你的实际项目环境,可能需要调整这部分逻辑以适应不同的依赖管理和配置方式。