2012-10-30 2 views
6

SOAP 클라이언트 클래스를 생성하는 데 CXF를 사용하고 있습니다. CXF documentation에는 다음과 같이 쓰여집니다.CXF 클라이언트 프록시는 스레드로부터 안전합니까?

JAX-WS 클라이언트 프록시는 스레드로부터 안전합니까?

JAX-WS 스펙에 따르면, 클라이언트 프록시는 스레드로부터 안전하지 않습니다. 이식성있는 코드를 작성하려면 스레드를 안전하지 않은 것으로 간주하고 액세스를 동기화하거나 인스턴스 풀 등을 사용해야합니다.

CXF 대답 : CXF 프록시는 많은 사용 사례에 대해 스레드로부터 안전합니다. 예외는 다음과 같습니다

대부분 "간단한"사용 사례를 들어

(I이 사용 사례 그들의 설명을 생략하고 있습니다) 여러 스레드에서 CXF 프록시를 사용할 수 있습니다. 위 내용은 다른 것들에 대한 대안을 설명합니다.

누구도 반대로 경험 한 적이 있습니까? 질문에없는 멀티 스레딩 문제가 발생 했습니까? 또는 설명이 정확하며 기본적으로 사용하기에 안전합니까?

+0

정확히 무엇을 의미합니까? 이는 CXF'wsdl2java' **에 의해 생성 된 Client Prox **가 (대부분) 스레드로부터 안전하다는 것을 의미합니까, 아니면 클라이언트 프로그램에서 실제 CXF API를 사용해야합니까? –

+0

@MaartenBoekhold 나는 생성 된 클라이언트 프록시를 의미했습니다. – Eyal

답변

6

우리는 최근 우리 프로젝트에서 비슷한 토론을했습니다. HTTP 도관을 즉석에서 수정하는 기능 (예 : 세션 관리 및 장애 조치 기능)을 제외하고 참조하는 FAQ에서 지정한대로 CXF 클라이언트 프록시는 스레드로부터 안전합니다. 이러한 기능을 사용하지 않으면 스레드간에 클라이언트 프록시를 공유해도됩니다.

1

아마도 런타임을 언급하고 있지만 구성 시간은 스레드 안전을위한 것이라고 생각하지 않습니다. 나는 JettyHTTPServerEngineFactory에서 경쟁 조건을 보았다고 생각한다.

테스트 하네스에서 관련없는 여러 SOAP 서버를 가져오고 버스를 공유 할 때 여러 스레드가 JettyHTTPServerEngine 인스턴스를 동시에 추가하려고하면 경쟁 조건이 발생할 수 있습니다. 특정 경쟁 조건은 setTLSServerParametersForPort()에 있으며 포트에 대해 HTTPS를 사용하려고 할 때 호출합니다. 이 메서드는 잠금없이 HashMap에 요소를 추가합니다.

나는 다른 사람들이이 문제를 겪지 않는 이유는 대부분의 사람들이 구성 파일을 통해 CXF를 구성한다는 것과 하나의 프로세스에서 여러 포트/부두 서버를 갖는 경우는 거의 없다는 것입니다.

+0

그리고 최신 버전의 CXF가이 특정 경쟁 조건을 수정했지만 CXF의 설명서에서 스레딩에 대한 최종 계약을 보지 못했습니다. 또한지도는 정적이므로 이전 버전의 경쟁 조건은 버스에 관계없이 발생합니다. –