2012-10-23 2 views
1

스프링 WS 2.1.0에 웹 서비스가 있습니다. 웹 서비스는 Tomcat 7에서 실행되며 데이터베이스의 데이터를 읽고 다른 보고서를 생성하는 하나의 트랜잭션 방식으로 끝점을 구현합니다. Tomcat 7은 JServ 프로토콜을 통해 Apache Server에서 실행됩니다.Spring WS 및 MultiThreadedHttpConnectionManager

Apache JMeter를 통한 스트레스 테스트 중에 동시 요청이 순차적으로 처리된다는 결론이 나왔습니다. 처음에는 데이터베이스 연결 풀 (commons-dbcp 및 나중에 tomcat-jdbc)을 조정하려고 시도했지만 결과는 동일했습니다. 엔드 포인트 메소드는 데이터를 읽기만하므로 읽기 후 쓰기 또는 읽 기 후 읽기 종속성이없고 트랜잭션을 병렬로 처리 할 수 ​​있습니다. 따라서 문제는 HTTP 연결 처리입니다.

일부 검색 (및 인터넷 검색) 후 Spring WS는 단일 연결 스레드 인 기본 연결 관리자 (SimpleHttpConnectionManager)와 함께 제공된다는 사실을 알게되었습니다. 좋은 방법은 SimpleHttpConnectionManager를 MultiThreadedHttpConnectionManager로 바꾸는 것입니다. I는 다음과 같습니다 샘플 코드 발견 :

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <constructor-arg> 
     <bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager> 
      <property name="maxConnectionsPerHost" value="20"/> 
      <property name="maxTotalConnections" value="100"/> 
     </bean> 
    </constructor-arg> 
</bean> 

을하지만 봄이 HttpClient를 사용 (ID하거나 autowiring에를 의미) 방법을 이해하지 않기 때문에이 예는 나에게 오히려 명확하지 않다. 제 경우에 Spring과 함께 MultiThreadedHttpConnectionManager를 사용하려면 어떻게해야합니까? 이 클래스의 구성된 인스턴스는 어디에 삽입해야합니까?

답변

5

HttpClient의 오해가 있습니다. 단지 6.2.1.1.1. HTTP transports을, HTTP 연결을 시작 볼 봄 WS 클라이언트 모듈에 사용되는 : HTTP를 통해 메시지를 보내기위한 WebServiceMessageSender 인터페이스의 두 가지 구현이 있습니다

. [...] 대안은 자카르타 커먼즈 HttpClient를 사용하는 CommonsHttpMessageSender입니다.

HttpClient은 서버 측에서 Spring WS가 사용될 때 전혀 필요하지 않습니다. 이 경우 HTTP (서버) 추상화를 제공하는 서블릿 컨테이너입니다. Tomcat 구성을 확인하십시오. 아마도 스레드 풀이 너무 작고 요청이 대기 중입니까? HttpClient은 여기에서 할 일이 전혀 없습니다. 미안하지만 어딘가에서 문제를 찾아야합니다.


그냥 다른 컴퓨터에서 SOAP 서비스에 액세스하는 봄 WS를 사용하는 경우, HttpClient의 다음과 같은 설정이 적용, 완전한 답을 유지하기 :

  • maxConnectionsPerHost가 - 얼마나 많은 동시 연결 HttpClient하는 것은 허용된다 동일한 호스트 (그림 : Keep-Alive 헤더 참조)에 보관 하시겠습니까? 대부분의 브라우저는 동일한 호스트에 대한 동시 연결 수를 2/4/8로 제한합니다. HttpClient이 그 동작을 따르므로 원칙적으로 같은 호스트에 2/4/8 이상의 동시 연결을 설정할 수 없습니다.

  • maxTotalConnections - 그러나 모든 호스트에 대해 합계. 다른 서버에있는 수백 개의 다른 웹 서비스에 연결하는 경우이 숫자는 열린 연결의 총 수입니다.

+0

유용한 답장을 보내 주셔서 감사합니다. 나는 정말로 서버 쪽에서 MultiThreadedHttpConnectionManager를 사용하려고하는 것과 혼동을 느꼈다.몇 시간 동안 코드를 디버깅 한 후 문제가 일부 타사 라이브러리에 있음을 알았 기 때문에 HTTP 요청을 전달하는 것과 관련한 제 가정은 잘못되었습니다. 이들은 순차적 인 요청 처리를 유발 한 캐싱없이 원격 보안 스토리지에서 데이터를 읽습니다. –