如何编写简洁的apache camel xml

时间:2014-01-06 14:12:35

标签: apache-camel

我是Apache Camel的新手。我已经设置我的应用程序使用基于XML的配置使用Apache Camel。我的配置包含多个具有类似步骤的路由。我试图找到是否有办法将这些不同路线的共同或重复部分放在一个地方并从路线中引用它们而不是一次又一次地重复它们?

例如在我的下面的驼峰路线配置中,路线2从路线1重复几步。那么有没有办法提取路线1和路线2的常用步骤,然后从路线1和路线2引用提取的部分?

<context:property-placeholder location="classpath:quartz.properties" />

<context:component-scan base-package="com"></context:component-scan>

    <camel:route>
        <camel:from uri="quartz://deadlines/SDGWD?cron=15+34+14+?+*+MON-SUN+*" />
        <camel:onCompletion>
            <camel:to uri="seda:checkAnyPendingDeadlines"/>
        </camel:onCompletion>
        <camel:to uri="bean:sdgwdNotifier" />
        <camel:choice>
            <camel:when>
                <camel:method ref="deadlineHandler" method="canProcessDeadline" />
                <camel:bean ref="deadlineHandler" method="prepareDeadline" />
                <camel:bean ref="sdgwdProcessor" method="initiateMessageProcessing" />
                <camel:bean ref="schedulerXdrTransformer" method="marshall" />
                <camel:to uri="wmq:SU.SES" />
                <camel:bean ref="sdgwdProcessor" method="waitForAcknowledgment" />
                <camel:bean ref="sdgwdProcessor" method="afterMessageProcessed" />
                <camel:bean ref="deadlineHandler" method="onDeadlineProcessingCompletion" />
            </camel:when>
            <camel:otherwise>
                <camel:bean ref="deadlineHandler" method="enqueDeadline" />
            </camel:otherwise>
        </camel:choice>
    </camel:route>


    <camel:route>
        <camel:from uri ="seda:checkAnyPendingDeadlines"/>
        <camel:onCompletion>
            <camel:to uri ="seda:checkAnyPendingDeadlines"/>
        </camel:onCompletion>
        <camel:to uri="bean:deadlineHandler?method=getNextProcessableDeadline" />
        <camel:choice>
            <camel:when>
                <camel:method ref="deadlineHandler" method="canProcessDeadline" />
                <camel:bean ref="deadlineHandler" method="prepareDeadline" />
                <camel:choice>
                    <camel:when>
                        <camel:simple>${body.deadline} == ${type:settlementcontrol.scheduler.model.Deadline.SDGW} </camel:simple>
                        <camel:bean ref="sdgwdProcessor" method="initiateMessageProcessing" />
                        <camel:bean ref="schedulerXdrTransformer" method="marshall" />
                        <camel:to uri="wmq:SU.SES" />
                        <camel:bean ref="sdgwdProcessor" method="waitForAcknowledgment" />
                        <camel:bean ref="sdgwdProcessor" method="afterMessageProcessed" />
                        <camel:bean ref="deadlineHandler" method="onDeadlineProcessingCompletion" />
                    </camel:when>
                </camel:choice>
            </camel:when>
            <camel:otherwise>
                <camel:bean ref="deadlineHandler" method="enqueDeadline" />
            </camel:otherwise>
        </camel:choice>
    </camel:route>

谢谢, Vaibhav的

2 个答案:

答案 0 :(得分:1)

包含流量重复部分的常用路线是否足够?如果是这样,那么创建这样的东西:

<camel:route id="myCommonPartOfFlow">
   <camel:from uri="direct-vm:common-in"/>
   [common part]
</camel:route>

您现在可以从主要路线调用您的子(myCommonPartOfFlow)路线:

<camel:to uri="direct-vm:common-in/>

答案 1 :(得分:0)

您可以使用direct组件来创建分解公共部分的子路由或拆分路由,以便公共路由具有自己的路由,然后其他路由可以将消息发送到公共路由。例如,如果您有两条路线执行以下流程“流程A” - &gt; “过程B” - &gt; “过程C”和“过程D” - &gt; “过程B” - &gt; “进程E”然后您可以将进程B分成它自己的路由并执行以下操作:

from(“jms:queue:processB”) - “Process C” - &gt;结束() 过程A - &gt;设置标题“JMSReplyTo”,jms:queue:processC - &gt;到( “JMS:队列:进程B”) 方法C - &gt;设置标题“JMSReplyTo”,jms:queue:processE - &gt;到( “JMS:队列:进程B”)

为了简洁起见,我使用了Java DSL,但使用XML DSL也是如此。我还使用“过程A”等来抽象路线中的多个步骤。无论过程是什么,链接路线的概念都是相同的。这种方法的优点是它允许联合“进程B”来处理额外的负载并在您的基础结构周围分配处理。一旦你进入Asynchrounous编程,你的能力就会上升很多。