Mule批量提交和记录失败

mas*_*nta 5 mule batch-processing dataweave

我目前的情况:

我有10000条记录作为批量输入.根据我的理解,批处理仅用于逐个记录处理.因此,我在批处理步骤中使用dataweave组件转换每个记录(注意:我没有使用任何批处理提交)并将每个记录写入文件.进行逐条记录处理的原因在于,在任何特定记录中都存在无效数据,只有该特定记录失败,其余部分将被正确处理.

但在我看到的许多博客中,他们使用带有dataweave组件的batchcommit(带流).因此,根据我的理解,所有记录将一次性提供给数据编织,如果一条记录包含无效数据,则所有10000条记录都将失败(在数据编织时).然后,逐个记录处理的点丢失.以上假设是正确的还是我想错了?

这就是我不使用批量提交的原因.

现在,正如我所说,我将每条记录发送到一个文件.实际上,我确实需要将每条记录发送到5个不同的CSV文件.所以,目前我在BatchStep中使用Scatter-Gather组件将它发送到五个不同的路由.在此输入图像描述

因为,你可以看到图像.输入阶段提供10000条记录的集合.每条记录将使用Scatter-Gather发送到5条路线.

是,我使用的方法是好的,或任何更好的设计可以遵循?

此外,我已经创建了第二个批处理步骤,捕获FAILEDRECORDS.但是,使用当前的设计,我无法捕获失败的记录.

Mau*_*cco 5

简短的答案

以上假设是正确的还是我想错了?

简而言之,是的,您的想法是错误的。阅读我的 loooong 示例说明以了解原因,希望您会喜欢。

此外,我创建了第二批步骤,以仅捕获失败的记录。但是,使用当前的设计,我无法捕获失败的记录。

您可能忘记max-failed-records = "-1"在批处理作业上设置(无限制)。默认为 0,第一个失败的记录批处理将返回并且不执行后续步骤。

是,我使用的方法可以吗,或者可以遵循更好的设计?

我认为如果性能对您至关重要,并且您无法应对按顺序执行此操作所产生的开销,这是有道理的。相反,如果您可以放慢一点,那么在 5 个不同的步骤中执行此操作可能是有意义的,您将失去并行性,但您可以更好地控制失败的记录,尤其是在使用批量提交时。

MULE 批量作业在实践中

我认为最好的方法是通过一个例子来解释它是如何工作的。

考虑以下情况:您的批处理配置为max-failed-records = "-1"(无限制)。

<batch:job name="batch_testBatch" max-failed-records="-1">
Run Code Online (Sandbox Code Playgroud)

在这个过程中我们输入了一个由 6 个字符串组成的集合。

 <batch:input>
            <set-payload value="#[['record1','record2','record3','record4','record5','record6']]" doc:name="Set Payload"/>
 </batch:input>
Run Code Online (Sandbox Code Playgroud)

处理由 3 步组成” 第一步只是记录处理,第二步将改为进行记录并在 record3 上抛出异常以模拟失败。

<batch:step name="Batch_Step">
        <logger message="-- processing #[payload] in step 1 --" level="INFO" doc:name="Logger"/>
 </batch:step>
 <batch:step name="Batch_Step2">
     <logger message="-- processing #[payload] in step 2 --" level="INFO" doc:name="Logger"/>
     <scripting:transformer doc:name="Groovy">
         <scripting:script engine="Groovy"><![CDATA[
         if(payload=="record3"){
             throw new java.lang.Exception();
         }
         payload;
         ]]>
         </scripting:script>
     </scripting:transformer>
</batch:step>
Run Code Online (Sandbox Code Playgroud)

第三步将只包含提交计数值为 2 的提交。

<batch:step name="Batch_Step3">
    <batch:commit size="2" doc:name="Batch Commit">
        <logger message="-- committing #[payload] --" level="INFO" doc:name="Logger"/>
    </batch:commit>
</batch:step>
Run Code Online (Sandbox Code Playgroud)

现在你可以跟着我执行这个批处理:

在此处输入图片说明

开始时,第一步将处理所有 6 条记录,登录控制台将如下所示:

 -- processing record1 in step 1 --
 -- processing record2 in step 1 --
 -- processing record3 in step 1 --
 -- processing record4 in step 1 --
 -- processing record5 in step 1 --
 -- processing record6 in step 1 --
Step Batch_Step finished processing all records for instance d8660590-ca74-11e5-ab57-6cd020524153 of job batch_testBatch
Run Code Online (Sandbox Code Playgroud)

现在事情在第 2 步会更有趣,记录 3 将失败,因为我们显式抛出异常,但尽管如此,该步骤仍将继续处理其他记录,这里的日志将是什么样子。

-- processing record1 in step 2 --
-- processing record2 in step 2 --
-- processing record3 in step 2 --
com.mulesoft.module.batch.DefaultBatchStep: Found exception processing record on step ...
Stacktrace
....
-- processing record4 in step 2 --
-- processing record5 in step 2 --
-- processing record6 in step 2 --
Step Batch_Step2 finished processing all records for instance d8660590-ca74-11e5-ab57-6cd020524153 of job batch_testBatch
Run Code Online (Sandbox Code Playgroud)

此时尽管在此步骤中有失败的记录,批处理仍将继续,因为该参数max-failed-records设置为-1(无限制)而不是默认值 0。

此时所有成功的记录都将传递给 step3,这是因为默认情况下,accept-policy步骤的参数设置为NO_FAILURES。(其他可能的值是ALLONLY_FAILURES)。

现在包含计数等于 2 的提交阶段的 step3 将两两提交记录:

-- committing [record1, record2] --
-- committing [record4, record5] --
Step: Step Batch_Step3 finished processing all records for instance d8660590-ca74-11e5-ab57-6cd020524153 of job batch_testBatch
-- committing [record6] --
Run Code Online (Sandbox Code Playgroud)

如您所见,这证实了失败的 record3 没有传递到下一步,因此没有提交。

从这个例子开始,我认为你可以想象和测试更复杂的场景,例如在提交之后你可以有另一个步骤来处理失败的记录,让管理员知道失败的邮件。在您始终可以使用外部存储来存储有关您的记录的更多高级信息之后,您可以在我对另一个问题的回答中阅读。

希望这可以帮助