使用 Spring 每个操作的自定义超时配置
Custom timeout configuration per operation using Spring
我正在使用 Soap WS,我必须为每个操作自定义超时配置。自定义其实是用cxf
和它的http-conf:conduit
来完成的,不能自定义到操作级别
我的实际配置是:
<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.package.PortType" />
<property name="address" ref="URL_WS" />
</bean>
<bean id="URL_WS" class="java.lang.String">
<constructor-arg value="http://serveraddress/Service"/>
</bean>
<http-conf:conduit name="http://serveraddress/Service.*">
<http-conf:client ConnectionTimeout="10000" ReceiveTimeout="10000"/>
</http-conf:conduit>
在这个配置下,这个WS的所有超时都达到10000ms。
按照上面的解释,我想自定义到操作级别,我找到了this link并尝试按照流程进行,但是我遇到了执行问题,但我只com.ibm.wsdl.util.xml.QNameUtils
在我的工厂方法的类路径中:
public static QName newQName(Node paramNode)
,采用 org.w3c.dom.Node
.
的方法
我试图通过此实现来更改代码:
<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="delegate">
<jaxws:client serviceClass="com.package.PortType" address="URL_WS" >
<jaxws:outInterceptors>
<bean class="com.package.CustomTimeoutInterceptor">
<property name="receiveTimeoutByOperationName">
<map key-type="javax.xml.namespace.QName" value-type="java.lang.Long">
<entry value="10">
<key>
<bean class="com.ibm.wsdl.util.xml.QNameUtils" factory-method="newQName">
<!-- I don't know what to put here -->
</bean>
</key>
</entry>
</map>
</property>
</bean>
</jaxws:outInterceptors>
</jaxws:client>
</property>
</bean>
我的 Node
实现是 com.sun.org.apache.xerces.internal.dom.NodeImpl
。我不知道我必须使用哪个 NodeImpl
' 子类以及如何创建它以使其以 bean 方式工作,我有点迷失在这些不同实现和这些不同 dom 级别。
我只想创建一个 Node
的对象子类,它可以在这个 QNameUtils
方法中工作
要么
寻找不同的方式来自定义我的配置
我终于解决了这个问题,这是有效的解决方案:
我保留了CustomTimeoutInterceptor of the link, mixed the solution with the help of this link。
我也保留了我的初始配置,我发现 javax.xml.namespace.QName
有一个工厂方法。我刚刚将这部分添加到我的配置中:
<!-- Creation of the bean for the interceptor -->
<bean id="timeoutSetter" class="com.package.CustomTimeoutInterceptor">
<property name="receiveTimeoutByOperationName">
<map key-type="javax.xml.namespace.QName" value-type="java.lang.Long">
<entry value="20000">
<key>
<bean class="javax.xml.namespace.QName" factory-method="valueOf">
<constructor-arg value="{http://serveraddress/Service}Operation1" />
</bean>
</key>
</entry>
</map>
</property>
</bean>
<!-- I had the interceptor the list of outInterceptors -->
<cxf:bus>
<cxf:outInterceptors>
<ref bean="timeoutSetter"/>
</cxf:outInterceptors>
</cxf:bus>
我正在使用 Soap WS,我必须为每个操作自定义超时配置。自定义其实是用cxf
和它的http-conf:conduit
来完成的,不能自定义到操作级别
我的实际配置是:
<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.package.PortType" />
<property name="address" ref="URL_WS" />
</bean>
<bean id="URL_WS" class="java.lang.String">
<constructor-arg value="http://serveraddress/Service"/>
</bean>
<http-conf:conduit name="http://serveraddress/Service.*">
<http-conf:client ConnectionTimeout="10000" ReceiveTimeout="10000"/>
</http-conf:conduit>
在这个配置下,这个WS的所有超时都达到10000ms。
按照上面的解释,我想自定义到操作级别,我找到了this link并尝试按照流程进行,但是我遇到了执行问题,但我只com.ibm.wsdl.util.xml.QNameUtils
在我的工厂方法的类路径中:
public static QName newQName(Node paramNode)
,采用 org.w3c.dom.Node
.
我试图通过此实现来更改代码:
<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="delegate">
<jaxws:client serviceClass="com.package.PortType" address="URL_WS" >
<jaxws:outInterceptors>
<bean class="com.package.CustomTimeoutInterceptor">
<property name="receiveTimeoutByOperationName">
<map key-type="javax.xml.namespace.QName" value-type="java.lang.Long">
<entry value="10">
<key>
<bean class="com.ibm.wsdl.util.xml.QNameUtils" factory-method="newQName">
<!-- I don't know what to put here -->
</bean>
</key>
</entry>
</map>
</property>
</bean>
</jaxws:outInterceptors>
</jaxws:client>
</property>
</bean>
我的 Node
实现是 com.sun.org.apache.xerces.internal.dom.NodeImpl
。我不知道我必须使用哪个 NodeImpl
' 子类以及如何创建它以使其以 bean 方式工作,我有点迷失在这些不同实现和这些不同 dom 级别。
我只想创建一个 Node
的对象子类,它可以在这个 QNameUtils
方法中工作
要么
寻找不同的方式来自定义我的配置
我终于解决了这个问题,这是有效的解决方案:
我保留了CustomTimeoutInterceptor of the link, mixed the solution with the help of this link。
我也保留了我的初始配置,我发现 javax.xml.namespace.QName
有一个工厂方法。我刚刚将这部分添加到我的配置中:
<!-- Creation of the bean for the interceptor -->
<bean id="timeoutSetter" class="com.package.CustomTimeoutInterceptor">
<property name="receiveTimeoutByOperationName">
<map key-type="javax.xml.namespace.QName" value-type="java.lang.Long">
<entry value="20000">
<key>
<bean class="javax.xml.namespace.QName" factory-method="valueOf">
<constructor-arg value="{http://serveraddress/Service}Operation1" />
</bean>
</key>
</entry>
</map>
</property>
</bean>
<!-- I had the interceptor the list of outInterceptors -->
<cxf:bus>
<cxf:outInterceptors>
<ref bean="timeoutSetter"/>
</cxf:outInterceptors>
</cxf:bus>