[英]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.