1

我们使用 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);

因此,如您所见,我们正在定义最大值。连接和超时。

我有一个解决方法我会分享,希望能帮助像我一样匆忙的人。如果专家没有更好的答案,我会在几天后将我的答案标记为好答案。

4

1 回答 1

3

1) PoolTimeout 以防止连接被卡住(出于任何原因)

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

httpClient.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, 1000L);

在本条目中,我们将其称为 PoolTimeout 。确保它是 Long,因为 Integer(或 int)会引发 ClassCastException,甚至会阻止您的服务在客户端之外触发。

您正在开发的使用 Axis 的系统可能又是另一个系统的客户端。并且那个其他系统肯定会有一个特定的ConnectionTimeout。所以我建议

PoolTimeout <= ConnectionTimeout

例子:

serviceClient.getOptions().setProperty(HTTPConstants.CONNECTION_TIMEOUT, httpConnectionTimeout);
httpClient.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, Long.valueOf(httpConnectionTimeout) );

2) 连接释放

我正在使用Amila 的连接管理建议,但实际上连接并没有像我预期的那样快速释放(因为我有意识地准备了模拟外部系统的延迟时间会相应地响应我的调整配置的适合限制)。

因此,我发现在方法org.apache.axis2.client.OperationClient.executeImpl(boolean)中的下一行有助于在池中的连接被使用后立即将其标记为可用:

HttpMethod method = (HttpMethod) getOperationContext().getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)
        .getProperty(HTTPConstants.HTTP_METHOD);
method.releaseConnection();

这就是 Axis 在调用serviceClient.cleanupTransport()时尝试做的事情,但似乎上下文不正确。

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

一个更好的答案将不胜感激。

于 2013-10-04T17:29:23.833 回答