【问题标题】:how to write concise apache camel xml如何编写简洁的 apache camel xml
【发布时间】:2014-01-06 14:12:34
【问题描述】:

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

谢谢, 毗婆娑

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    包含重复部分流程的公共路线是否足够?如果是这样,则创建如下内容:

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

    您现在可以从主路由调用子 (myCommonPartOfFlow) 路由:

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

    【讨论】:

    • 谢谢@罗伯特。我已经使用直接组件提取了常用部分。但是,我希望避免重复围绕子路线完成的几个步骤。 Apache camel doc 说 AOP 已被弃用。那么有没有更好的方法来围绕建议实现 AOP 呢?
    • 你能解释一下为什么这些步骤不能成为常见流程的一部分(或举个例子),让我更好地理解问题吗?
    【解决方案2】:

    您可以使用direct 组件创建子路由来分解公共部分或拆分您的路由,以便公共路由有自己的路由,然后其他路由可以向公共路由发送消息。例如,如果您有两条路线执行以下流程“流程 A”->“流程 B”->“流程 C”和“流程 D”->“流程 B”->“流程 E”,那么您可以分开将 B 处理到自己的路由中并执行以下操作:

    from("jms:queue:processB") - "进程 C" -> end() 进程 A -> 设置标题“JMSReplyTo”,jms:queue:processC -> to(“jms:queue:processB”) 进程 C -> 设置 Header "JMSReplyTo", jms:queue:processE -> to("jms:queue:processB")

    为了简洁起见,我使用了 Java DSL,但同样可以使用 XML DSL。我还使用“流程 A”等来抽象路线中可能是多个步骤的内容。无论过程是什么,链接路由的概念都是相同的。这种方法的优点是它允许“进程 B”的联合来处理额外的负载并在您的基础架构周围分配处理。一旦你进行了异步编程,你的能力就会大大提高。

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多