2014-09-25 73 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

相關問題