Soap 使用WebServiceGatewaySupport处理对多个WebService的请求

Soap 使用WebServiceGatewaySupport处理对多个WebService的请求,soap,spring-ws,Soap,Spring Ws,我正在使用SpringWS-core构建一个SOAP客户端。为此,我扩展了WebServiceGatewaySupport以进行服务调用 public class WeatherClient extends WebServiceGatewaySupport { ... public WeatherResponse getCityForecastByZip(String zipCode) { GetCityForecastByZIP request = new GetCit

我正在使用SpringWS-core构建一个SOAP客户端。为此,我扩展了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;
    }
...
}
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。我知道我可以通过SpringWebServiceTemplate进行服务调用,并指定要使用的URI。所以我的想法是使用一个WebServiceGatewaySupport来处理对不同服务的所有调用。在每次调用中,我都会传递soap操作、相应的请求(如果有)和web服务URL。我的应用程序应该在多线程环境中运行


使用单个WebServiceGatewaySupport来处理对不同URI的并发调用是否是一种好做法?

查看
WebServiceGatewaySupport
源代码,简称asnwer:是的,可以将其用于不同的URL,并且底层的
WebServiceTemplate
是线程安全的


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

您说的没关系。你能详细解释一下为什么它不比ok好吗?所有的努力工作都委托给了
WebServiceTemplate
,对于它来说,如果你使用不同的URL或相同的URL,这可能是默认的URL,这并不重要。因此,当然最好只为
WebServiceTemplate
提供一个实例,以避免过度的GC工作。同样的规则适用于您的目标
WebServiceGatewaySupport
。然而,我从未使用过它:
WebServiceTemplate
总是足够了。