权重分配:开始的时候自动分配去执行某一服务,在执行的过程中,如果出现请求异常或者是程序异常,则会自动的切换另一服务或者是另一操作。
如果需要在OSGI的ServiceMix中要达到如此效果,那么需要在配置文件中做到对应的配置。
一、首先,我们创建一个blueprint.xml文件(当然此文件可以修改为别的名称,最好单独的提取出来),blueprint的规范就不放出来了,之前的博客里有了详细的说明,下面直接说重点。
目前是因为服务相同的请求入口,所以我们还是得用CM把路径给配上去
<cm:property-placeholder persistent-id="xxx.Common.test.service" update-strategy="reload"> <cm:default-properties> <cm:property name="test.ServiceAddress" value="http://0.0.0.0:8022/test/service" /> </cm:default-properties> </cm:property-placeholder>
<reference id="Process1" interface="org.apache.camel.Processor" filter="(&(scope=xxx.Common.Demo1)(processor=DemoProcessor1))"/> <reference id="Process2" interface="org.apache.camel.Processor" filter="(&(scope=xxx.Common.Demo2)(processor=DemoProcessor2))"/>
1、Demo1--blueprint.xml
<bean id="JmustProcessor" class="xxxx.Common.Demo1.Service.DemoProcessor1" > <property name="camelcontext" ref="Demo1ServiceCamelContext"/> <!-- 这里还可以注入自己想注入的实现或者是各种想注入的东西 --> <property name="method" ref="serviceImpl"/> </bean> <service id="serviceProcessor1" ref="JmustProcessor" interface="org.apache.camel.Processor"> <service-properties> <entry key="scope" value="scope=xxx.Common.Demo1"/> <entry key="processor" value="DemoProcessor1"/> </service-properties> </service>
2、Demo2--blueprint.xml
<bean id="Processor2" class="xxxx.Common.Demo2.Service.DemoProcessor2" > <property name="camelcontext" ref="Demo1ServiceCamelContext"/> <!-- 这里还可以注入自己想注入的实现或者是各种想注入的东西 --> <property name="method" ref="serviceImpl"/> </bean> <service id="serviceProcessor2" ref="Processor2" interface="org.apache.camel.Processor"> <service-properties> <entry key="scope" value="scope=xxx.Common.Demo2"/> <entry key="processor" value="DemoProcessor2"/> </service-properties> </service>
<camel-cxf:cxfEndpoint id="testService" address="${test.ServiceAddress}" serviceClass="xxx.Common.Demo.Interface" bindingId="http://www.w3.org/2003/05/soap/bindings/HTTP/" > <camel-cxf:properties> <entry key="dataFormat" value="POJO"/> </camel-cxf:properties> </camel-cxf:cxfEndpoint>
<camelContext id="ServiceCamel" xmlns="http://camel.apache.org/schema/blueprint" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> <route></route> ........ </camelContext>
<!-- 权重分配 --> <route id="loadBalanceSend"> <from uri="testService"/> <setHeader headerName="fristTime"> <constant>true</constant> </setHeader> <loadBalance> <weighted roundRobin="false" distributionRatio="1:1" distributionRatioDelimiter=":"/> <to uri="vm:Demo1Sender"/> <to uri="vm:Demo2Sender"/> </loadBalance> </route> <route id="Demo1Sender"> <from uri="vm:Demo1Sender" /> <to uri="bean:Process1"/> <log message="${header.responseCode}"/> <choice> <when> <simple>${header.responseCode} == '999999' && ${header.fristTime} == true</simple> <setHeader headerName="fristTime"> <constant>false</constant> </setHeader> <to uri="vm:Demo2Sender"/> </when> </choice> </route> <route id="Demo2Sender"> <from uri="vm:Demo2Sender" /> <to uri="bean:Process2"/> <log message="${header.responseCode}"/> <choice> <when> <simple>${header.responseCode} == '999999' && ${header.fristTime} == true</simple> <setHeader headerName="fristTime"> <constant>false</constant> </setHeader> <to uri="vm:Demo1Sender"/> </when> </choice> </route>