【问题标题】:Call SOAP service asynchronously using Spring使用 Spring 异步调用 SOAP 服务
【发布时间】:2018-02-02 05:25:24
【问题描述】:

我必须异步调用 SOAP Web 服务。目前,我正在使用 Spring webservicetemplate 以同步方式调用它。

当前配置如下:

    <bean id="interceptedHttpClientBuilder" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject" ref="httpClientBuilder" />
        <property name="targetMethod" value="addInterceptorFirst"> </property>
        <property name="arguments">
            <list>
                <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender.RemoveSoapHeadersInterceptor"/>
            </list>
        </property>
    </bean>

    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
        <property name="socketTimeout" value="120000" />
    </bean>

    <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
    <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />

    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
        <property name="defaultRequestConfig" ref="requestConfig" />
    </bean>

    <bean id="messageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
        <constructor-arg ref="httpClient"></constructor-arg>
    </bean>

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="packagesToScan">
            <list><value>...</value></list>
        </property>
    </bean>

    <bean id="wsClientSecurityInterceptor"  
        class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">  
        <property name="securementActions" value="UsernameToken" />  
        <property name="securementUsername"><value>${username}</value></property>  
        <property name="securementPassword"><value>${password}</value></property>
        <property name="securementPasswordType" value="PasswordText" />
    </bean>

    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
        <property name="marshaller" ref="jaxb2Marshaller"></property>
        <property name="unmarshaller" ref="jaxb2Marshaller"></property>
        <property name="defaultUri"><value>${ws.url}</value></property>
        <property name="interceptors">  
            <list>  
                <ref local="wsClientSecurityInterceptor"/>  
            </list>  
        </property>
        <property name="messageSender" ref="messageSender"></property>
    </bean>

Java 调用如下所示:

MyResponse response = (MyResponse) webServiceTemplate.marshalSendAndReceive(req, new WebServiceMessageCallback() {
                        public void doWithMessage(WebServiceMessage message) {
                        ((SoapMessage) message).setSoapAction("test");
                        }
                    });

我可以知道如何更改它以异步调用服务吗?或者我是否需要在春季使用其他东西来实现这一目标?

【问题讨论】:

  • 查看Spring的@Async注解

标签: spring web-services spring-integration webservicetemplate


【解决方案1】:

不确定您为什么在问题中使用spring-integration 标签,但如果我们在这里,请务必查看Future&lt;&gt; 作为返回类型的@MessagingGatewayhttps://docs.spring.io/spring-integration/docs/5.0.1.RELEASE/reference/html/messaging-endpoints-chapter.html#async-gateway

可以通过 Spring Integration 调用 SOAP WebService &lt;int-ws:outbound-gateway&gt;: https://docs.spring.io/spring-integration/docs/5.0.1.RELEASE/reference/html/ws.html

样本在这里:https://github.com/spring-projects/spring-integration-samples

为了更清楚,代码可能如下所示:

<int:gateway id="mathService" 
             service-interface="org.springframework.integration.samples.async.gateway.MathServiceGateway"
             default-request-channel="requestChannel"
             async-executor="executor"/>

MathServiceGateway 是这样的:

public interface MathServiceGateway {

    Future<Integer> multiplyByTwo(int i);
}

WS 调用也很简单:

<int-ws:outbound-gateway request-channel="requestChannel" uri="http://www.w3schools.com/xml/tempconvert.asmx"/>

【讨论】:

    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 2020-06-05
    • 2014-05-30
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多