我在输入文件夹中有一堆相关的PDF和XML文件:
1.PDF - 1.XML
2.PDF - 2.XML
3.PDF - 3.XML
etc.
PDF文件是扫描文档,相关XML文件包含与PDF文件相关的索引信息。
我使用Apache Camel轮询文件夹中的XML和PDF文件,然后在我有一个相关的对后,我会将其发布到输出文件夹。理想情况下,我想最后发布XML文件。
以下代码似乎正确地选择了对,但是当我尝试再次拆分文件时收到错误消息。
@Grab('org.apache.camel:camel-core:2.13.0')
@Grab('org.slf4j:slf4j-simple:1.6.6')
import org.apache.camel.*
import org.apache.camel.impl.*
import org.apache.camel.builder.*
import org.apache.camel.util.jndi.*
def jndiContext = new JndiContext();
def dataDir = "/${System.properties['user.home']}/test/file-poller-demo"
def camelContext = new DefaultCamelContext(jndiContext)
camelContext.addRoutes(new RouteBuilder() {
def void configure() {
from("file://${dataDir}/in")
.aggregate(simple('${file:onlyname.noext}')).completionSize(2).groupExchanges()
.split(body())
.to("file://${dataDir}/out")
}
})
camelContext.start()
addShutdownHook{ camelContext.stop() }
synchronized(this){ this.wait() }
错误讯息:
没有可用类型的主体:java.io.InputStream但具有值:Exchange [1.xml]类型:org.apache.camel.impl.DefaultExchange on:1.txt。引发者:没有类型转换器可以从类型:org.apache.camel.impl.DefaultExchange转换为所需类型:java.io.InputStream,其值为Exchange [1.xml]。交换[1.TXT]。
答案 0 :(得分:1)
以下是Java DSL中的工作示例。
您可以在聚合交换后添加额外的处理器来设置正确的输出体,但在文件使用者中没有noop = true选项,聚合后第一个文件将被移动到.camel,文件生成器将抛出表达式当它试图将其写入发件箱文件夹时。
from("file:data/inbox?noop=true")
.aggregate(simple("${file:onlyname.noext}")).completionSize(2).groupExchanges()
.split(body())
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Exchange exchangeIn = exchange.getIn().getBody(Exchange.class);
exchange.getIn().setBody(exchangeIn.getIn().getBody(GenericFile.class));
exchange.getIn().setHeaders(exchangeIn.getIn().getHeaders());
}
})
.to("file:data/outbox/");
我认为最好将文件加载到内存数据存储区中并在之后进行聚合。
在以下路由中,在使用文件后,它将添加到内存数据存储中。在汇总聚合之后,将从拆分器中的数据存储中检索文件,并在最后一次交换中清除数据存储。文件使用者中的删除选项是可选的。如果没有添加,文件将在完成后移动到.camel。
from("file:data/inbox?delete=true")
.setProperty("correlationId", simple("${file:onlyname.noext}"))
.beanRef("dataStoreBean","addToStore")
.aggregate(property("correlationId")).completionSize(2).groupExchanges()
.split(body())
.beanRef("dataStoreBean", "getFromStore")
.to("file:data/outbox/");
数据存储区bean位于:
public class DataStoreBean {
Map<String,byte[]> dataStore = new HashMap<String,byte[]>();
public void addToStore(Exchange exchange) {
dataStore.put(exchange.getIn().getHeader(Exchange.FILE_NAME,StrinTheg.class),exchange.getIn().getBody(byte[].class));
exchange.getOut().setBody(exchange.getIn().getHeader(Exchange.FILE_NAME,String.class));
}
public void getFromStore(Exchange exchange) {
Exchange fileExchange = exchange.getIn().getBody(Exchange.class);
String fileName = fileExchange.getIn().getBody(String.class);
exchange.getOut().setHeader(Exchange.FILE_NAME, fileName);
exchange.getOut().setBody(dataStore.get(fileName));
if(exchange.getProperty("CamelSplitComplete", Boolean.class)) {
String correlationId = fileExchange.getProperty("correlationId", String.class);
dataStore.remove(correlationId+".pdf");
dataStore.remove(correlationId+".xml");
}
}
}