2014-09-25 2 views
0

SOAP 클라이언트를 작성하는 데 spring-ws-core를 사용하고 있습니다. 이를 위해 WebServiceGatewaySupport를 확장하여 서비스 호출을 작성합니다.WebServiceGatewaySupport를 사용하여 여러 웹 서비스에 대한 요청을 처리합니다.

public class WeatherClient extends WebServiceGatewaySupport { 
... 
    public WeatherResponse getCityForecastByZip(String zipCode) { 
     GetCityForecastByZIP request = new GetCityForecastByZIP(); 
     request.setZIP(zipCode); 

     GetCityForecastByZIPResponse response = (GetCityForecastByZIPResponse) this.getWebServiceTemplate().marshalSendAndReceive(request, 
       new SoapActionCallback("http://ws.cdyne.com/WeatherWS/GetCityForecastByZIP")); 

     return response; 
    } 
... 
} 

봄 구성이 하나의 웹 서비스에 대해 잘 작동

@Configuration 
public class WebServicesConfiguration { 

    private static final String WEATHER_SERVICE_DEFAULT_URI = "..."; 


    @Bean(name = "servicesMarshaller") 
    public Jaxb2Marshaller servicesMarshaller() { 
     Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
     marshaller.setContextPath("some.package"); 
     return marshaller; 
    } 

    @Bean 
    public WeatherClient weatherService(@Qualifier("servicesMarshaller") Jaxb2Marshaller marshaller) { 
     WeatherClient client = new WeatherClient(WEATHER_SERVICE_DEFAULT_URI); 
     client.setMarshaller(marshaller); 
     client.setUnmarshaller(marshaller); 
     return client; 
    } 

} 

매우 간단합니다. 이제는 비슷한 웹 서비스가 많이 있다고 가정하지만 각 웹 서비스에는 자체 .wsdl 사양과 URI가 있습니다. 스프링 WebServiceTemplate을 통해 서비스 호출을하고 사용할 URI를 지정할 수 있다는 것을 알고 있습니다. 그래서 내 생각은 단일 WebServiceGatewaySupport를 사용하여 다른 서비스에 대한 모든 호출을 처리하는 것이 었습니다. 각 호출에서 비누 조치, 해당 요청 (있는 경우) 및 웹 서비스 URL을 전달합니다. 내 응용 프로그램은 멀티 스레드 환경에서 실행되는 것으로 가정합니다.

하나의 WebServiceGatewaySupport를 사용하여 다른 URI에 대한 동시 호출을 처리하는 것이 좋습니다.

답변

1

WebServiceGatewaySupport 소스 코드를 보면 짧은 URL을 사용할 수 있습니다. 예, 다른 URL에도 사용할 수 있으며 기본이되는 WebServiceTemplate은 스레드로부터 안전합니다.

요청간에 일부 상태를 저장하지 않으면 구현도 스레드로부터 안전합니다.

+0

괜찮 았어. 왜 그것이 낫지 않은지 자세히 설명해 주시겠습니까? –

+0

모든 힘든 일은'WebServiceTemplate'에 위임됩니다. 다른 URL이나 기본 URL을 사용하는 경우에는 중요하지 않습니다. 따라서 과도한 GC 작업을 피하기 위해 'WebServiceTemplate' 인스턴스를 하나만 가지는 것이 더 좋습니다. 동일한 규칙이 대상 'WebServiceGatewaySupport'에 대한 것입니다. 그러나 나는 결코 그것을 사용하지 않았다 :'WebServiceTemplate'은 항상 충분하다. –