我们要求处理一个记录超过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。怎么解决这个?任何帮助表示赞赏。
答案 0 :(得分:0)
对于涉及审计窃听的用例,eip派上用场。您可以参考http://camel.apache.org/wire-tap。根据Camel的定义,Wire Tap(来自EIP模式)允许您在将消息转发到最终目的地时将消息路由到单独的位置。
基本上,窃听创建了一个不同的线程,并使用原始交换的副本执行所需的功能。如果发生故障,您可以使用相同的窃听路由来执行任何更新。要确认它是按顺序处理的,您可以将并发使用者设置为1,这样您就不会处于竞争状态。