用例是我有一个包含许多zip
个文件的csv
文件。然后将每个文件中的每一行发送到seda
队列进行处理。我遇到的问题是,我想知道seda
队列何时处理了每一行以执行其他工作。我不确定如何处理这个问题。目前,我正在调查使用轮询来测试seda
队列何时为空,但如果线路的处理速度快于它们到达时,这可能会产生错误的结果。
我有一个解压缩zip
文件的类,并将每个文件作为InputStream
读取。然后将文件中的每一行发送给生产者,生产者又被发送到seda
队列。
@Component
public class CsvProcessor {
@Resource(name = "csvLineProducer")
ProducerTemplate producer;
public void process(InputStream flatFileStream) throws IOException {
if (flatFileStream==null) return;
try {
LineIterator it = IOUtils.lineIterator(flatFileStream, "UTF-8");
while (it.hasNext()) {
final String recordLine = it.nextLine();
this.producer.send(new Processor() {
public void process(Exchange outExchange) {
outExchange.getIn().setBody(recordLine);
}
});
}
} finally {
IOUtils.closeQuietly(flatFileStream);
}
}
}
这是驼色配置。
<camelContext xmlns="http://camel.apache.org/schema/spring" trace="true">
<template id="csvLineProducer" defaultEndpoint="seda:flatRecordStream"/>
...
<route>
<from uri="seda:flatRecordStream" />
<bean ref="myProcessor" method="processLine" />
</route>
...
</camelContext>