Reputation: 311
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&throwExceptionOnFailure=false"/>
<to uri="jetty:http://localhost:9090/greeter?bridgeEndpoint=true&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&throwExceptionOnFailure=false" />
<to uri="jetty:http://localhost:9090/greeter?bridgeEndpoint=true&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?
Upvotes: 3
Views: 133
Reputation: 385
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.
Upvotes: 2