代码之家  ›  专栏  ›  技术社区  ›  Николай Мишин

如何在Spring xml中向Camel http平衡器添加转换?

  •  3
  • Николай Мишин  · 技术社区  · 8 年前

    我通过骆驼制作http平衡器 http://www.jboss.org/products/fuse/download/

    %fuse_dir%=c:\temp\jboss-fuse-6.2.1.redhat-084
    %path%=%path%;%fuse_dir%\bin;
    

    )

    git clone https://github.com/mishin/http-balancer-camel.git
    cd http-balancer-camel/smx-ws-examples-jboss-fuse-6.2.1
    mvn clean install
    fuse console
    

    我们在fuse控制台中写入

    JBossFuse:karaf@root> features:addurl mvn:com.fusesource.examples/ws-features/1.0-SNAPSHOT/xml/features
    JBossFuse:karaf@root> features:install smx-ws-examples
    JBossFuse:karaf@root> list | grep Examples
    JBossFuse:karaf@root> log:Display
    

    开始我们的测试服务 现在我们有3项服务:
    http://localhost:9091/greeterProxy?wsdl
    http://localhost:9090/greeter?wsdl
    http://localhost:9090/greeterImpl?wsdl

    所以我们构建了平衡器

    git clone https://github.com/mishin/http-balancer-camel.git
    cd http-balancer-camel/camel-gateway
    mvn -Djava.net.preferIPv4Stack=true camel:run
    

    这么短的代码是
    https://github.com/mishin/http-balancer-camel/blob/master/camel-gateway/src/main/resources/META-INF/spring/applicationContext.xml

        <camelContext trace="false" id="greeterGateway" xmlns="http://camel.apache.org/schema/spring">
      <route id="proxyRoute">
        <from uri="jetty:http://localhost:9092/greeterProxy?matchOnUriPrefix=true"/>
        <loadBalance>
          <failover>
            <exception>java.io.IOException</exception>
          </failover>
          <to uri="jetty:http://localhost:9090/greeterImpl?bridgeEndpoint=true&amp;throwExceptionOnFailure=false"/>
          <to uri="jetty:http://localhost:9090/greeter?bridgeEndpoint=true&amp;throwExceptionOnFailure=false"/>
          <convertBodyTo type="java.lang.String"/>
        </loadBalance>
      </route>
    </camelContext>
    

    我制作故障转移http平衡器
    所以如果我从web浏览器呼叫
    http://localhost:9092/greeterProxy?wsdl
    比我得到的

    <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.greeter.examples.fusesource.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns3="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://examples.fusesource.com/greeter" name="ConcreteGreeterService" targetNamespace="http://impl.greeter.examples.fusesource.com/">
    <wsdl:import location="http://localhost:9090/greeterImpl?wsdl=Greeter.wsdl" namespace="http://examples.fusesource.com/greeter"></wsdl:import>
    <wsdl:binding name="ConcreteGreeterServiceSoapBinding" type="ns1:Greeter">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="greetMe">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="greetMe">
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="greetMeResponse">
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="pingMe">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="pingMe">
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="pingMeResponse">
    <soap:body use="literal"/>
    </wsdl:output>
    <wsdl:fault name="PingMeFault">
    <soap:fault name="PingMeFault" use="literal"/>
    </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="greetMeOneWay">
    

    ... 我需要转型 改变

    <wsdl:output name="pingMeResponse">
    

    <wsdl:output name="pingAnotherResponse">
    

    我试过了 例如,简单转换

        <convertBodyTo type="java.lang.String" />
        <transform>
            <simple>${in.body.replaceAll("greet([A-Z])Response", "bar$1foo")}</simple>
        </transform>
    

    完整代码为:

    <camelContext trace="false" id="greeterGateway" xmlns="http://camel.apache.org/schema/spring">
        <route id="proxyRoute">
            <from uri="jetty:http://localhost:9092/greeterProxy?matchOnUriPrefix=true" />
            <loadBalance>
                <failover>
                    <exception>java.io.IOException</exception>
                </failover>
                <to uri="jetty:http://localhost:9090/greeterImpl?bridgeEndpoint=true&amp;throwExceptionOnFailure=false" />
                <to uri="jetty:http://localhost:9090/greeter?bridgeEndpoint=true&amp;throwExceptionOnFailure=false" />
                <convertBodyTo type="java.lang.String" />
            </loadBalance>
    
            <convertBodyTo type="java.lang.String" />
            <transform>
                <simple>${in.body.replaceAll("greet([A-Z])Response", "bar$1foo")}</simple>
            </transform>
    
        </route>
    </camelContext>
    

    但它根本不起作用
    当我调用时 http://localhost:9092/greeterProxy?wsdl
    它不能取代

    <wsdl:output name=“pingMeResponse”>
    

    为什么?

    1 回复  |  直到 8 年前
        1
  •  2
  •   oborovyk    8 年前

    FailOverLoadBalancer使用异步路由引擎,这意味着您的转换块不会命中响应。尝试使用直接端点,并将转换代码放在单独的路由中(从direct->到jetty->转换)。这应该会有所帮助。