如何拆分聚合器创建的附加文件

时间:2014-10-20 11:18:26

标签: groovy apache-camel

我在输入文件夹中有一堆相关的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]。

1 个答案:

答案 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");
    }
}
}