2013-10-04 8 views
0

HttpConnections Axis2 1.5.1 프로젝트를 사용하여 코드에서 효율적으로 사용되지 않는 곳입니다. 호스트 당 최대 연결 수를 제한하고 애플리케이션을 강조함으로써 의도적 인 한계에 따라 예상 한 응답 성이 좋지 않았고 때로는 연결이 끊임없이 갇히게되어 사용 가능한 연결이 요청이 없었던 시점에 도달 할 때까지 적게 걸리게되었습니다 응용 프로그램에 의해.Axis2 1.5.1 연결 관리

구성 : 당신이 볼 수있는

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

1) PoolTimeout 어떤 이유로 (stucked있어 연결)

다음 줄을 우리가 Axis2를 영원히 stucked있어 연결을 잃는 것을 방지하는 데 도움이 방지 :

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

이의이 PoolTimeout을 부르 자를 이 항목의. Integer (또는 int)가 ClassCastException을 발생시켜 클라이언트 외부에서 서비스가 트리거되지 않도록하기 때문에 Long인지 확인하십시오.

Axis를 사용하여 개발중인 시스템은 다른 시스템의 클라이언트가 될 수 있습니다. 그리고 그 다른 시스템은 구체적으로 ConnectionTimeout을 가질 것입니다.

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

2) 연결 내가 Amila's suggestion for connection management를 사용했지만, 나는 그들이 될 것으로 예상 사전에 실제로 연결 (빨리 출시되지 않은

해제 : 그래서

PoolTimeout <= ConnectionTimeout 

예 제안 왜냐하면 나는 의식적으로 지연 시간을 조롱 한 외부 시스템이 필자의 튜닝 구성에 맞추어 반응 한계에 대응할 준비를했기 때문이다.

그래서 나는 그것이 사용 된 것 같은 (부울)가 즉시 풀에서 연결을로 사용할 표시하는 데 도움이 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()을 호출 할 때 수행하려고 시도한 것이지만 컨텍스트가 올바르지 않은 것 같습니다.

성능 튜닝은 예측 가능한 방식으로 작동하므로 통합 요구 사항에 가장 적합한 튜닝 구성을 선택하는 것은 통합 업체의 손입니다.

더 나은 대답은 높이 평가 될 것입니다.

+0

참고 : OperationClient.executeImpl (부울 값) * 표준 동작 "override"하려면 ** ServiceClient **, ** Options ** 및 ** OperationClient ** 복사본을 만들고이를 다음과 같이 내 스텁에 설정하십시오. stub._setServiceClient (serviceClient = new MyServiceClient (stub._getServiceClient())); 이 세 클래스는 메서드 호출을 Axis 원래 클래스에 위임하지만 executeImpl을 오버라이드하여 연결을 해제합니다. –