Mule批处理-在批块中处理记录并聚合到文件

Mule批处理-在批块中处理记录并聚合到文件,mule,mule-component,Mule,Mule Component,我有一个有500k记录的输入文件。我需要批量处理这些记录,应用转换并写入输出文件。我试着用下面的流程来做一点实验。batch.block大小设置为1000。输出文件仅包含1000条记录。其余49万条记录丢失 据我所知,批处理为每个块大小启动一个新实例,在这种情况下,每1000条记录将由一个新线程处理。这些线程是否相互覆盖?如何将所有转换的记录收集到输出文件中 <flow name="poll-inbound-file"> <file:inbound-en

我有一个有500k记录的输入文件。我需要批量处理这些记录,应用转换并写入输出文件。我试着用下面的流程来做一点实验。batch.block大小设置为1000。输出文件仅包含1000条记录。其余49万条记录丢失

据我所知,批处理为每个块大小启动一个新实例,在这种情况下,每1000条记录将由一个新线程处理。这些线程是否相互覆盖?如何将所有转换的记录收集到输出文件中

    <flow name="poll-inbound-file">
        <file:inbound-endpoint path="${file.inbound.location}"
            pollingFrequency="${file.polling.frequency}" responseTimeout="10000"
            doc:name="File" metadata:id="abce53af-7d82-411a-a75a-5cd8ae8e55ae"
            fileAge="${file.fileage}" moveToDirectory="${file.outbound.location}"/>
        <custom-interceptor
            class="com.example.TimerInterceptor" doc:name="Timer" />

        <dw:transform-message doc:name="Transform Message"
            metadata:id="dcf84872-5aca-404f-9169-d448c9e4cd76">
            <dw:input-payload mimeType="application/csv" />
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
payload as :iterator]]></dw:set-payload>
        </dw:transform-message>
        <batch:job name="process-batchBatch" block-size="${batch.blocksize}">

        <batch:process-records>
            <batch:step name="Batch_Step1">
                <logger level="TRACE" doc:name="Logger" message="#[payload]" />
            </batch:step>
            <batch:step name="Batch_Step2">
                <logger level="TRACE" doc:name="Logger" message="#[payload]" />
            </batch:step>
            <batch:step name="Batch_Step3">

                <batch:commit  doc:name="Batch Commit" size="1000">
                <expression-component doc:name="Expression"><![CDATA[StringBuilder sb=new StringBuilder();
 for(String s: payload)
 {
     sb.append(s);
     sb.append(System.lineSeparator());
 }
 payload= sb.toString();]]></expression-component>
                    <file:outbound-endpoint path="${file.outbound.location}"
                        responseTimeout="10000" doc:name="File" />
                </batch:commit>
            </batch:step>
        </batch:process-records>
        <batch:on-complete>
            <logger
                message="******************************************** Batch Report **************************************"
                level="INFO" doc:name="Logger" />
        </batch:on-complete>
    </batch:job>

    </flow>

同时从多个线程写入文件通常是不安全的。相反,将结果写入诸如ActiveMQ之类的队列,并使用另一个流读取队列中的数据,然后写入文件。您可以决定是在处理文件之前还是之后从队列开始处理