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에 대한 동시 호출을 처리하는 것이 좋습니다.
괜찮 았어. 왜 그것이 낫지 않은지 자세히 설명해 주시겠습니까? –
모든 힘든 일은'WebServiceTemplate'에 위임됩니다. 다른 URL이나 기본 URL을 사용하는 경우에는 중요하지 않습니다. 따라서 과도한 GC 작업을 피하기 위해 'WebServiceTemplate' 인스턴스를 하나만 가지는 것이 더 좋습니다. 동일한 규칙이 대상 'WebServiceGatewaySupport'에 대한 것입니다. 그러나 나는 결코 그것을 사용하지 않았다 :'WebServiceTemplate'은 항상 충분하다. –