在Apache Camel中是否有一种方法可以通过另一条路径上的路由获取和释放锁定

时间:2015-12-14 07:07:29

标签: apache-camel

我正在寻找路由可以获取并释放另一条路径上的锁的方法,下面是我的代码片段,我正在寻找snmp-trap-route和snmp-timer-route可以获得的解决方案对业务逻辑路由的独占锁定,而正在处理其他的应该等到它完成。

<route id="snmp-trap-route">
<from uri="snmp:{{snmp.host}}:{{snmp.port}}?protocol=udp&amp;type=TRAP" />
<to uri="direct:snmp-main-route"/>

<route id="snmp-timer-route">
<from uri="timer://pulse?fixedRate=true&amp;period=1000" />
<to uri="direct:snmp-main-route"/>

<route id="snmp-main-route">
        <from uri="direct:snmp-main-route" />
            <choice>
                <when>
                    <simple>${property[batch.ended]} == true </simple>                      
                    <to uri="direct:transacted-endpoint" />
                </when>
                <when>
                    <simple>${property[batch.started]} == true </simple>                        
                    <to uri="direct:business-logic-endpoint" />
                </when>
                <otherwise>                 
                    <to uri="direct:business-logic-endpoint" />
                </otherwise>
            </choice>               
    </route>

<route id="business-logic-route">
        <from uri="direct:business-logic-endpoint"/>
        <setProperty propertyName="route.name">
            <constant>TestRoute</constant>
        </setProperty>
        <process ref="messageMultiplierProcessor" />
        <process ref="calculatedFieldsProcessor" />
        <process ref="tableProcessor" />                        
    </route>

<route id="transacted-route">
        <from uri="direct:transacted-endpoint"/>
        <transacted/>
        <to uri="direct:business-logic-endpoint"/>
        <onException>
            <exception>java.lang.Exception</exception>
            <handled>
                <constant>true</constant>
            </handled>
            <rollback markRollbackOnly="true"/>
        </onException>
    </route>

1 个答案:

答案 0 :(得分:0)

您可以使用队列达到相同的结果。

队列1-by-1处理消息。如果您的路由位于相同的camelcontext中,则可以使用Seda组件来实现此目的。否则你可以使用activemq

<route id="snmp-trap-route">
<from uri="snmp:{{snmp.host}}:{{snmp.port}}?protocol=udp&amp;type=TRAP" />
<to uri="seda:business-logic-route"/>

<route id="snmp-timer-route">
<from uri="timer://pulse?fixedRate=true&amp;period=1000" />
<to uri="seda:business-logic-route"/>

<route id="business-logic-route">
<from uri="seda:business-logic-endpoint"/>            
<setProperty propertyName="esq.route.name">
    <constant>TestRoute</constant>
</setProperty>
<process ref="messageMultiplierProcessor" />
<process ref="calculatedFieldsProcessor" />      

这样,business-logic-route中的下一条消息只会在business-logic-route完成后处理。也许这就是你要找的东西。