OSGI系列 权重分配

权重分配:开始的时候自动分配去执行某一服务,在执行的过程中,如果出现请求异常或者是程序异常,则会自动的切换另一服务或者是另一操作。

如果需要在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>

二、 我是把blueprint.xml这个文件修改名字后单独的提取出来放在ServiceMix的deploy中的,所以需要将发布出去的Processor给引用进来,假如说我有2个服务需要权重分配,那么我们需要这样做

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

三、 肯定也有人会问,Processor是从哪里发布出去的呢?不急,现在我就慢慢说来,这里的2个Processor那就相当于2个服务,2个小项目,那么我们分别需要在2个小项目中把服务发布出去给我们自己使用,这个发布跟之前说的发布restful和webservice不一样,我们可以这样理解,就是说我们要把2个项目中的processor弄成一个全局的类,只要在容器中(JVM)能够访问的意思。

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>

四、 就这样,集成了2个服务了,那还剩怎么发布出去给别人调用了,统一入口,享受到不同的服务,现在用camel-cxf去发布出去

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

大功告成!


你可能感兴趣的:(OSGI系列,权重分配)