我试图在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。
任何帮助将不胜感激。提前谢谢。
答案 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);