我们有一个 Web 服务客户端应用程序,它有太多的请求需要在单个保持活动连接上处理。
因此,我们希望创建多个保持活动连接。
我正在使用 CXF HTTP 管道进行连接,其中所有端点、服务名称、端口名称都相同。如何指定在">连接 B"而不是"连接 A">上发送此请求?
我现在遇到问题,它发送到"连接 A"而不是"连接 B"。
Client client = ((org.apache.cxf.jaxws.DispatchImpl) dispatch).getClient();
HTTPConduit conduit = (HTTPConduit) client.getConduit();
conduit.getClient().setConnection(ConnectionType.KEEP_ALIVE);
conduit.getClient().setReceiveTimeout(0);
conduit.getClient().setConnectionTimeout(0);
TLSClientParameters tlsClientParameters = new TLSClientParameters();
tlsClientParameters.setSSLSocketFactory(socketFactory);
tlsClientParameters.setDisableCNCheck(true);
conduit.setTlsClientParameters(tlsClientParameters);
我假设你的意思是当你启用keep-alive时,Tomcat会因为套接字太多而过载。 Tomcat 有两个设置来限制保持活动会话的数量。 第一个是保持活动会话的最大数量,默认为 100,但您可以使用系统属性降低该值:
server.tomcat.max-keep-alive-requests
将此值设置为低于 100 的值,直到服务器永远不会使用过多的保持活动套接字。 将其设置为正确的最大值后,应查看:
server.tomcat.keep-alive-timeout
- 这决定了保持活动状态会话的保留时间。 减少此时间(以毫秒为单位,而不是以秒为单位(将优先考虑频繁发送请求的客户端,而不是不发送请求的客户端。 默认值为 60000(1 分钟(。
PS 你还没有说你使用的是哪个网络服务器,但默认是 Tomcat,所以我假设你使用的是 Tomcat,否则有类似的设置,例如 Jetty。
上述方法应该可以解决您的问题,但如果不能解决,您仍然可以按如下方式配置故障转移逻辑:
// 5 attempts, connect timeout 5 seconds, receive timeout 20 seconds (per attempt)
// Should take about 30 seconds to fail if the server is completely down
final RetryStrategy retryStrategy = new RetryStrategy();
retryStrategy.setMaxNumberOfRetries(5);
retryStrategy.setDelayBetweenRetries(1000);
FailoverFeature failoverFeature = new FailoverFeature();
failoverFeature.setStrategy(retryStrategy);
failoverFeature.setTargetSelector(new FailoverTargetSelector(address));
jaxWsProxyFactoryBean.getFeatures().add(failoverFeature);
serviceBean = jaxWsProxyFactoryBean.create();
HTTPConduitConfigurer httpConduitConfigurer = (name, address, c) ->
{
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(5000);
httpClientPolicy.setReceiveTimeout(20000);
c.setClient(httpClientPolicy);
};
Client client = ClientProxy.getClient(serviceBean);
client.getBus().setExtension(httpConduitConfigurer, HTTPConduitConfigurer.class);