2011-11-09 8 views
1

CXF의 Servlet 전송 및 Jetty 6.1을 사용하여 서비스를 제공하는 응용 프로그램이 있습니다. 이 응용 프로그램은 또한 외부 서비스를 사용해야합니다. 모든 서비스는 WS-Addressing 사양 (및 WS-RM 상단)을 지원합니다. 외부 서비스를 사용하기 위해 응용 프로그램에서 생성 된 서비스 클라이언트를 실행합니다.CXF : 기존 Servlet 전송을 통해 분리 된 끝점 제공

문제는 클라이언트에 대해 분리 된 끝점을 제공하면 (WS-RM이이 끝점에서 별도의 HTTP 연결을 통해 들어오는 메시지를 수신해야 함) CXF가 다른 서티 서버 인스턴스를 실행한다는 것입니다. 서블릿 전송 (서비스 제공)과 클라이언트 (일부 외부 서비스 사용)는 동일한 버스를 공유합니다. Jetty의 두 인스턴스가 필요하지 않습니다 (같은 HTTP 포트에서 실행할 수 없다는 말은 아닙니다).

기존의 부두 서버와 서블릿 전송을 사용하여 분리 된 끝점을 제공 할 수있는 방법이 있습니까?

Client client = ClientProxy.getClient(port); 
HTTPConduit httpConduit = (HTTPConduit) client.getConduit(); 
httpConduit.getClient().setDecoupledEndpoint(
    "http://domain.com:port/services/dec_endpoints/TestDecEndpoint"); 

내가 상대 경로를 제공하는 경우 ("/ dec_endpoints/TestDecEndpoint"상대 경로는 서블릿 전송을 통해 서비스의 제공에 사용되는 것처럼) :

지금까지,이 같은 분리 할 엔드 포인트를 사용 가능 , HTTP 도관은 SOAP 메시지의 헤더에 전체 경로를 지정하지 않으므로 (서버가/dec_endpoints/TestDecEndpoint에 메시지를 보낼 수 없음).

답변

2

좋아, 해결책을 찾았습니다. 분리 된 끝점의 상대 경로를 지정하고 서버가 주소에 응답을 보낼 수 있도록 수동으로 MAPAggregator 인터셉터를 변경 한 후 (분리 된 대상을 설정하기 때문에) 메시지의 주소 지정 속성을 수동으로 변경해야합니다.

그래서 우리가 무엇을 :

    상대 경로를 사용하여
  1. 분리 대상 : http://addr.com:port/servlet_path/dec_endpoints/SomeDestination

여기에 경로가 변경 될 수있는 방법을 예입니다 : 절대 경로로 /dec_endpoints/SomeDestination

  • <ReplyTo> 헤더 :

    public class ReplyToInterceptor extends AbstractPhaseInterceptor<Message> 
    { 
        public ReplyToInterceptor() { 
         super(Phase.PRE_LOGICAL); 
         addAfter(MAPAggregator.class.getName()); 
        } 
    
        public void handleMessage(Message message) { 
         AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, 
          true); 
         EndpointReferenceType replyTo = maps.getReplyTo(); 
         replyTo.getAddress().setValue(
          "http://address.com:port/servlet_path/dec_endpoints/SomeDestination"); 
        } 
    }