Mule - VM端点不按顺序处理消息

时间:2014-07-21 12:08:22

标签: java csv mule mule-studio

我试图在Mule中处理大型CSV文件(250k +行x6列)。我使用this question作为指导,汇总了以下内容:

<!-- File Connectors -->
<file:connector name="FileConnector" workDirectory="..." autoDelete="false" streaming="true" doc:name="File"/>

<flow name="mainFlow" doc:name="mainFlow" processingStrategy="synchronous">

    <file:inbound-endpoint name="FileEndpoint" path="..." pollingFrequency="1000"  moveToDirectory="..." connector-ref="FileConnector">
        <file:filename-wildcard-filter pattern="*.csv" caseSensitive="true"/>   
    </file:inbound-endpoint>

    <component class="com.package.name.CSVLineReader" doc:name="Java"/>     

</flow>

<flow name="processFlow" doc:name="processFlow" processingStrategy="synchronous">

    <vm:inbound-endpoint exchange-pattern="one-way" path="linein" doc:name="VM"/>

    <logger level="DEBUG" message="#[payload]" doc:name="Debug"/>

    <!-- Process each line of CSV file -->

</flow>

我的Java类如下:

public class CSVLineReader implements Callable {

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {

        InputStream fileStream = (InputStream) eventContext.getMessage().getPayload();
        DataInputStream ds = new DataInputStream(fileStream);
        BufferedReader br = new BufferedReader(new InputStreamReader(ds));

        LocalMuleClient muleClient = eventContext.getMuleContext().getClient();

        String line;
        while ((line = br.readLine()) != null) {
            muleClient.dispatch("vm://linein", line, null);
        }

        muleClient.dispatch("vm://linein", "FILE-DONE", null);

        fileStream.close();     
        return null;
    }

}

我遇到的问题是,当我将每一行传递给VM时,VM组件后面的日志顺序不是我所期望的顺序他们是。使用小(6行)文件进行测试时,日志的顺序并不总是与文件的顺序相匹配。我看到控制台输出类似于:

DEBUG 2014-07-21 13:02:03,474 [[processes].connector.VM.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: <CSV LINE 1>
DEBUG 2014-07-21 13:02:03,478 [[processes].connector.VM.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: <CSV LINE 3>
DEBUG 2014-07-21 13:02:03,479 [[processes].connector.VM.mule.default.receiver.03] org.mule.api.processor.LoggerMessageProcessor: <CSV LINE 2>
DEBUG 2014-07-21 13:02:03,479 [[processes].connector.VM.mule.default.receiver.04] org.mule.api.processor.LoggerMessageProcessor: <CSV LINE 4>
DEBUG 2014-07-21 13:02:03,483 [[processes].connector.VM.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: <CSV LINE 6>
DEBUG 2014-07-21 13:02:03,484 [[processes].connector.VM.mule.default.receiver.06] org.mule.api.processor.LoggerMessageProcessor: FILE-DONE
DEBUG 2014-07-21 13:02:03,485 [[processes].connector.VM.mule.default.receiver.05] org.mule.api.processor.LoggerMessageProcessor: <CSV LINE 5>

我必须省略实际的CSV内容以保密,但正如您所看到的,订单不正确,有时我会在文件的最后一行之前看到FILE-DONE日志。 #39;正在阅读。

我想知道是否有一种方法可以强制VM端点遵循同步,先进先出的类型处理策略?我已经为我的流量processingStrategy设置了同步,但这似乎并不能解决我遇到的问题。作为参考,我使用的是Mule 3.4.0。

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

Dispatch()=通过Mule服务器将事件异步调度到endpointUri。 Send()=通过Mule服务器同步向endpointUri发送事件,并返回结果消息。

https://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/client/MuleClient.html

因此,请将您的代码更新为以下内容:

while ((line = br.readLine()) != null) {
    muleClient.send("vm://linein", line, null);
}

muleClient.send("vm://linein", "FILE-DONE", null);