3
votes

I make http balancer through the Camel (install JBoss Fuse befor 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

in fuse console we write

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

that start our testing services now we have 3 services:
http://localhost:9091/greeterProxy?wsdl
http://localhost:9090/greeter?wsdl
http://localhost:9090/greeterImpl?wsdl

so we build balancer

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

so short code is
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>

I make failover http-balancer
so if I call from web browser
http://localhost:9092/greeterProxy?wsdl
than I got

<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">

... I need make transformation change

<wsdl:output name="pingMeResponse">

to

<wsdl:output name="pingAnotherResponse">

I tyr it through simple transformation, for example

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

full code is:

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

but it doesn't work at all
when I invoke http://localhost:9092/greeterProxy?wsdl
it doesn't replace

<wsdl:output name="pingMeResponse">

why?

1

1 Answers

2
votes

FailOverLoadBalancer uses async routing engine which means that your transform block doesn't hit the response. Try to use direct endpoints and put the transform code inside separate routes (from direct->to jetty-> transform). That should help.