Java Axis2 1.5.1连接管理

Java Axis2 1.5.1连接管理,java,axis2,connection-pooling,webservices-client,Java,Axis2,Connection Pooling,Webservices Client,使用Axis2 1.5.1项目的代码没有有效地使用HttpConnections。通过设置每个主机的最大连接数的特定限制并强调应用程序,响应性并不是我预期的好,根据故意的限制,有时连接会被不确定地阻塞,因此每次可用的连接都会减少,直到应用程序没有处理任何请求为止 配置: MultiThreadedHttpConnectionManager connManager = new MultiThreadedHttpConnectionManager(); HttpConnectionManagerPa

使用Axis2 1.5.1项目的代码没有有效地使用HttpConnections。通过设置每个主机的最大连接数的特定限制并强调应用程序,响应性并不是我预期的好,根据故意的限制,有时连接会被不确定地阻塞,因此每次可用的连接都会减少,直到应用程序没有处理任何请求为止

配置:

MultiThreadedHttpConnectionManager connManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams connectionManagerParams = connManager.getParams();
connectionManagerParams.setMaxTotalConnections(httpMaxConnections);
connectionManagerParams.setDefaultMaxConnectionsPerHost(httpMaxConnectionsPerHost);

HttpClient httpClient = new HttpClient(connManager);

ConfigurationContext axisContext;
try {
    axisContext = ConfigurationContextFactory.createDefaultConfigurationContext();
} catch (Exception e) {
    throw new AxisFault(e.getMessage());
}

axisContext.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);

service = new MyStub(axisContext, url);

ServiceClient serviceClient = service._getServiceClient();

serviceClient.getOptions().setProperty(HTTPConstants.CONNECTION_TIMEOUT, httpConnectionTimeout);
serviceClient.getOptions().setProperty(HTTPConstants.SO_TIMEOUT, httpReadTimeout);
serviceClient.getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Constants.VALUE_TRUE);
如你所见,我们定义了最大连接数和超时数

我有一个解决办法,我将与大家分享,希望能帮助别人在紧急情况下,因为我是。如果专家没有更好的答案,我会在几天后将我的答案标记为好答案。

1)池超时以防止连接因任何原因受阻

下一行帮助我们防止Axis2永远失去连接:

httpClient.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, 1000L);
在这个条目中,我们称之为PoolTimeout。请确保它是长的,因为整数(或int)将引发ClassCastException,这将阻止您的服务在客户端之外被触发

您正在开发的系统,即使用Axis的系统,可以反过来成为另一个系统的客户机。而另一个系统肯定会有一个特定的连接timeout。所以我建议

PoolTimeout <= ConnectionTimeout
2) 连接释放

我正在使用,但实际上连接并没有像我预期的那样提前释放(因为我有意识地准备好了模拟外部系统的延迟时间将相应地响应我的tunning配置的适配限制)

因此,我发现在org.apache.axis2.client.OperationClient.executeImpl(布尔值)方法中的下一行有助于在池中的连接一经使用就标记为可用:

HttpMethod method = (HttpMethod) getOperationContext().getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)
        .getProperty(HTTPConstants.HTTP_METHOD);
method.releaseConnection();
这就是Axis在调用serviceClient.cleanupTransport()时尝试执行的操作,但上下文似乎不正确

现在,性能调试正在以一种可预测的方式工作,因此我们的集成商可以选择最适合生产需要的调试配置

更好的答案将不胜感激。

注意:为了“覆盖”OperationClient.executeImpl(布尔)标准行为,我创建了ServiceClient、Options和OperationClient的副本,并将它们设置到我的存根中,如下所示:存根。_setServiceClient(ServiceClient=new MyServiceClient(stub._getServiceClient());这三个类只是将方法调用委托给Axis原始类,但重写executeImpl以释放连接。
HttpMethod method = (HttpMethod) getOperationContext().getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)
        .getProperty(HTTPConstants.HTTP_METHOD);
method.releaseConnection();