Web Services Web服务客户端-到同一目标的多个HTTP保持活动连接

b5buobof  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(160)

我们有一个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);
deikduxw

deikduxw1#

我假设您的意思是当您启用keep-alive时,Tomcat会因为套接字太多而过载。Tomcat有两个设置来限制keep-alive会话的数量。第一个是keep-alive会话的最大数量,默认值为100,但您可以使用system属性降低该值:

server.tomcat.max-keep-alive-requests

将此值设置为小于100的值,直到服务器不再使用过多的保持活动套接字。将此值设置为正确的最大值后,应查看:

server.tomcat.keep-alive-timeout
  • 它决定保持活动状态会话的保留时间。缩短此时间(以毫秒为单位,而不是以秒为单位)将使频繁发送请求的客户端优先于不频繁发送请求的客户端。默认值为60000(1分钟)。

PS你还没有说你使用的是哪个Web服务器,但是默认的是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);

相关问题