0

我有一个在文件夹中生成 xml 更新的进程,无论是否发生任何更改。如果这些文件与上次更新到已处理文件夹不同,我想将它们移动,否则删除它们。使用 cacheSize 为 1 的 FileIdempotentRepository 过滤重复文件是否有意义,还是我走错了路?如何告诉下面的路由使用文件内容作为幂等键?

<bean id="fileStore" class="org.apache.camel.processor.idempotent.FileIdempotentRepository">
    <property name="fileStore" value="target/fileidempotent/.filestore.dat"/>
    <property name="cacheSize" value="1" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="file://inputFolder" />
        <idempotentConsumer messageIdRepositoryRef="fileStore">
            <!-- I DO NOT want to use the messageId, how do I use the entire file contents? -->
            <header>messageId</header>
            <to uri="file://outputFolder"/>
        </idempotentConsumer>
    </route>
</camelContext>

为避免混淆,这是我正在尝试做的伪代码:

current = ''
watch(inputFolder).onNewFile(f):
  if (f.contents == current)
    delete f
  else
    mv f to outputFolder
    current = f.contents

更新真希望有人能得到这个赏金!

如果您知道如何在此上下文文件中使用内联 Groovy/脚本,那也对我有用。Simple

4

1 回答 1

1

幂等消费者的表达式可以是 Camel 支持的任何内容,例如以下任何一种语言:http ://camel.apache.org/languages

所以你想要的是消息体作为相关表达式,为此你可以使用

<simple>${body}</simple>

但是由于文件组件将文件路由为 java.io.File 句柄,因此您需要将内容加载到内存中进行比较,因此您可以这样做

  <from uri="file://inputFolder" />
  <convertBodyTo type="String" />
  <idempotentConsumer messageIdRepositoryRef="fileStore">
     <simple>${body}</simple>
     ...
于 2013-11-14T13:52:01.967 回答