2014-09-25 700 views
0

我正在使用spring-ws-core构建SOAP客户端。为此,我正在扩展WebServiceGatewaySupport以进行服务调用。使用WebServiceGatewaySupport处理对多个Web服务的请求

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; 
    } 
... 
} 

Spring的配置是非常简单的

@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; 
    } 

} 

这只是正常的单个Web服务。现在,假设我有很多类似的Web服务,但每个服务都有自己的.wsdl规范和URI。我知道我可以通过Spring WebServiceTemplate进行服务调用并指定要使用的URI。所以我的想法是使用一个WebServiceGatewaySupport来处理所有对不同服务的调用。在每次调用中,我都会传递soap操作,相应的请求(如果有)以及Web服务URL。我的应用程序假设在多线程环境中运行。

这是一个很好的做法,使用单个WebServiceGatewaySupport来处理对不同URI的并发调用吗?

回答

1

寻找WebServiceGatewaySupport源代码,简短的asnwer:是的,它可以用于不同的URL,以及底层的WebServiceTemplate是线程安全的。

如果不在请求之间保存某些状态,那么您的实现也将是线程安全的。

+0

你说的没关系。你能详细说明为什么它不比好? – 2014-09-25 17:52:10

+0

如果您使用不同的URL或相同(可能是默认的),所有的辛苦工作都委托给'WebServiceTemplate',因此无关紧要。因此,最好只有一个“WebServiceTemplate”实例来避免过多的GC工作。同样的规则是针对你的目标'WebServiceGatewaySupport'。但是我从来没有用过它:'WebServiceTemplate'总是够用的。 – 2014-09-25 18:54:52