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

时间:2017-07-20 02:28:27

标签: mule mule-component

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

根据我的理解,批处理为每个块大小启动一个新实例,在这种情况下,每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>

1 个答案:

答案 0 :(得分:0)

同时从多个线程写入文件通常是不安全的。而是将结果写入ActiveMQ等队列,并使另一个流从队列中读取,然后写入文件。您可以决定是否要在处理文件之前或之后从队列开始处理。