使用 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>