繁体   English   中英

ule声-VM端点未按顺序处理消息

[英]Mule - VM endpoint isn't processing messages in order

我正在尝试在Mule中处理大型CSV文件(250k +行x 6列)。 以此问题为指导,我总结了以下流程:

<!-- 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日志。

我想知道是否有一种方法可以强制VM端点遵循同步的,先进先出的类型处理策略? 我已经为我的流程设置了processingStrategy为同步,但是这似乎无济于事。 作为参考,我使用的是Mule 3.4.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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM