Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel 在原始有效负载保持不变的情况下异步处理交换_Apache Camel_Jbossfuse_Apache Servicemix - Fatal编程技术网

Apache camel 在原始有效负载保持不变的情况下异步处理交换

Apache camel 在原始有效负载保持不变的情况下异步处理交换,apache-camel,jbossfuse,apache-servicemix,Apache Camel,Jbossfuse,Apache Servicemix,我们需要处理一个超过10万条记录的文件。每个记录都应生成为XML并保存到数据库中。我们能够实现一个可以处理超过500k条记录的系统,现在我们有了一个新的需求,需要将每条记录转换成另一种形式的XML,并保存在另一个表中以供审计 我遵循以下方法来实现它。最初,每个记录都从平面文件中读取,转换为域协定,然后并行保存到审计表,并转换/充实为另一种格式并保存到域表。这是我正在使用的示例路线 <route> <from uri="direct-vm:d

我们需要处理一个超过10万条记录的文件。每个记录都应生成为XML并保存到数据库中。我们能够实现一个可以处理超过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>

UUID.randomUUID().toString()的

对于涉及审计的用例,wiretap eip很方便。你可以参考。根据Camel的定义,Wire Tap(来自EIP模式)允许您在将消息转发到最终目的地时将消息路由到单独的位置


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

您使用的是哪个数据库?也许可以将此审核函数移动到触发器中,然后从camel路由中删除它。那么,您的规范可能会要求您不要这样做。谢谢shiva。起初,我们尝试了窃听EIP,但它没有帮助我们。当我们尝试用2k记录测试它时,wiretap仅在原始目的地处理完所有消息后才开始处理所有记录。使用inOnly也做了同样的事情。