异步处理交换,同时原始有效负载保持不变

时间:2014-10-14 00:04:03

标签: apache-camel jbossfuse apache-servicemix

我们要求处理一个记录超过100k的文件。应将每条记录生成为XML并保存到DB。我们能够实现可以处理超过500k记录的系统,现在我们有了新的要求,将每个记录转换为另一种形式的XML并保存在另一个表中以供审计。

我按照以下方法实现它。最初从平面文件中读取每条记录,转换为域合同,然后并行保存到审计表并转换/充实到另一种格式并保存到域表。这是我正在使用的示例路线。

        <route>
           <from uri="direct-vm:domainInXML" />
           <setHeader headerName="auditID"><groovy>UUID.randomUUID().toString()</groovy>  </setHeader>
           <!-- aysn transform and save domain XML to audit DB -->
           <inOnly uri="vm:auditInXMLTransformAndDBPersistor"/>
           <to uri="activemq:queue:domianInQueue?disableReplyTo=true"/>
        </route>
        <route>
             <from uri="activemq:queue:domianInQueue" />
             <!-- transform and enrich headers -->
             <to uri="xslt:xslt/convertToInternalDomainContract.xsl />
             <to uri="direct-vm:transformAndSaveTODomainDB"/>
        </route>
         <route>
             <from uri="vm:auditInXMLTransformAndDBPersistor?concurrentConsumers=3" />
             <!-- transform and enrich headers -->
             <to uri="xslt:xslt/convertToAuditDomainContract.xsl />
             <to uri="direct-vm:transformAndSaveTOAuditDB"/>
        </route>

这里的问题是我们正在处理数千条记录,审计XML的转换和持久性是否在另一个线程中并行运行,而同一域XML转换为另一种格式并保存到域DB中?

会有延迟吗?你有什么更好的建议吗?当我们将审计XML保存到DB时,最初我们将状态设置为“CREATE”,并且在内部域的转换,验证和持久性失败期间,我们需要使用标头中的auditID将状态更新为审计表中的ERROR。

在处理由于某些错误而无法处理任何记录的过程中,我尝试使用标头中的auditID将状态更新为ERROR,但到那时,审计XML有可能不会发送到auditDB。怎么解决这个?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

对于涉及审计窃听的用例,eip派上用场。您可以参考http://camel.apache.org/wire-tap。根据Camel的定义,Wire Tap(来自EIP模式)允许您在将消息转发到最终目的地时将消息路由到单独的位置。

基本上,窃听创建了一个不同的线程,并使用原始交换的副本执行所需的功能。如果发生故障,您可以使用相同的窃听路由来执行任何更新。要确认它是按顺序处理的,您可以将并发使用者设置为1,这样您就不会处于竞争状态。