Apache camel 骆驼悬挂策略

Apache camel 骆驼悬挂策略,apache-camel,Apache Camel,我使用驼峰路由(R)将文件从a复制到B。但这是基于事件的,即有路由R1轮询目录(C),当找到任何文件时,其处理器触发R复制文件,然后挂起R 我想确保,当挂起A中的所有现有文件时,都复制到B,那么只有我会挂起。但是,任何关闭策略(不知道暂停时是否遵守此策略)都确保只有待处理的动态消息,即在暂停R之前,只有当前文件(R当前正在处理)将复制到B。但我希望所有存在的文件都必须复制到B 我如何确保这一点 限制条件: 路由R必须基于事件,当只有一个事件发生时,它将把现有的日志文件从A复制到B,然后它将进入睡

我使用驼峰路由(R)将文件从a复制到B。但这是基于事件的,即有路由R1轮询目录(C),当找到任何文件时,其处理器触发R复制文件,然后挂起R

我想确保,当挂起A中的所有现有文件时,都复制到B,那么只有我会挂起。但是,任何关闭策略(不知道暂停时是否遵守此策略)都确保只有待处理的动态消息,即在暂停R之前,只有当前文件(R当前正在处理)将复制到B。但我希望所有存在的文件都必须复制到B

我如何确保这一点

限制条件:

  • 路由R必须基于事件,当只有一个事件发生时,它将把现有的日志文件从A复制到B,然后它将进入睡眠状态,直到下一个事件发生
  • 如果R是基于事件的,并且由于A是所有日志所在的日志文件夹,我不能每次都复制所有日志…一个巨大的大小
  • 复制后,我无法从中删除文件
  • 谢谢,
    阿披实

    这是个问题吗


    如果路由中有一个计算文件夹中邮件数量的文件,如果没有文件,则关闭路由。

    有时,使用我们在“前骆驼”时代使用的好的旧Java堆栈会更容易。也就是说,在单独的
    处理器
    (或Camel-unwarebean)中自己复制文件:

    对于文件副本,使用apache commons项目中的
    org.apache.commons.io.FileUtils

    编辑:


    正如@Petter正确指出的,使用此解决方案,无需创建和启动必须再次关闭的单独路由。可以将目录复制处理器添加到触发复制的
    R1
    处理器。

    onCompletion会根据消息调用。我想要一个钩子,它将在所有消息完成时调用(根据路由开始时间快照)定义“全部”。路由中的消息处理是连续操作,而不是谨慎的批处理操作。它会在文件出现时不断从目录中抓取文件。所以,我猜你认为一个空源文件夹等于“所有消息都已完成”,每次完成一个消息后,你可以做一个简单的检查,并决定这是否是最后一个。我同意你的看法……我想在所有日志被复制时关闭路由。在那之前,一切都很好。我怎么能检测出一个文件夹是空的……我的意思是,如果我按照自己的逻辑来做,这将与Camel的逻辑不同,以跟踪哪些文件已经被复制。我可能会在目录中看到一个文件,所以对我来说这不是空的,路由还没有完成。但可能是,camel已经复制了该文件,因此从它的角度来看,它是一个空文件夹。文件组件有很多选项,比如preMove、move、delete等。当处理状态更改时,这些选项会重命名/删除/移动文件。您可以通过关联preMove文件名模式来确定camel是否正在处理文件。不管怎样,当文件夹为空时,您就完成了。这似乎很简单。文件夹完成后,我需要停止路由R…即。需要一个句柄,从中我将调用stopRoute()。我在上没有写权限,因此无法从中重命名/删除/移动任何文件。我仍然需要一个回调方法,它可以确保所有文件都被复制,也就是说,只有当所有文件都完成时,才由Camel调用。为什么需要R1?你能不能用一个路由R来监视C中的“就绪文件”,然后将所有内容从a复制到B?我想“等待准备好的文件”就是为什么要挂起R?好主意。适合这项工作的工具。然而,我不确定骆驼的东西在这里增加了什么价值。copyDirectory调用可能已经足够了。:)@Petter你完全正确,在这种情况下,没有必要创建单独的路由。文件复制处理器可以嵌入到
    R1
    路由中。@Peter:我添加了一些在解决这个问题时必须满足的约束条件
    @Override
    public void process(final Exchange exchange) throws Exception {
        final File source = new File("/path/to/in-directory");
        final File desc = new File("/path/to/out-directory");
        org.apache.commons.io.FileUtils.copyDirectory(source, desc);
    }