2014-04-03 50 views
0

我正在使用骆驼路由(R)将文件从A复制到B.但是这是基于事件的,即有路由R1轮询目录(C),并且当找到任何文件时,其处理器触发R复制文件,然后暂停R.骆驼暂停策略

我想确保,暂停A中的所有现有文件复制到B,然后只有我会暂停。但是,任何关机策略(不知道这是否在暂停时也是如此)确保只有待处理消息被处理,即只有当前文件(当前R正在处理的文件)将在R暂停之前被复制到B.但我想要全部存在文件必须复制到B.

我该如何确保。

约束:

  1. 路线R必须是基于事件的,当只有一个事件来那么只有它会复制从A到B现有的日志文件,那么它会进入休眠状态,直到下一个事件来
  2. 如果R是基于事件的,并且由于A是所有日志所在日志文件夹,所以我无法每次都复制所有日志...巨大的尺寸
  3. 复制后无法从A中删除文件

Tha nks, Abhishek

+0

你为什么需要R1?你可以不使用一个单一的路径R来监视C的“准备文件”,然后只复制从A到B的所有内容吗?我假设“等待准备好文件”是为什么你想暂停R? – Ralf

回答

0

这是一个问题吗?

由于在路径中有一个OnCompletion,用于统计文件夹中消息的数量,并且如果没有文件,请关闭路由。

+0

onCompletion被称为每条消息。我想要一个将在所有消息完成时调用的钩子(按照路径开始时间快照) –

+0

定义“全部”。路由中的消息处理是连续操作,而不是谨慎的批处理操作。它会在目录出现时从目录中抓取文件。所以,因为我猜你认为一个空白的源文件夹等于“所有消息都已完成”,所以每次消息完成后可以进行一次简单的检查,并确定是否是最后一次。 –

+0

我同意你的看法......我想在所有日志被复制时关闭路由。直到它很好。我如何检测一个文件夹是空的...我的意思是,如果我在我自己的逻辑上做,它不会与骆驼的逻辑类似,以跟踪哪些文件已被复制。我可能会在A目录中看到一个文件,因此对于我来说这不是空的,而且路由尚未完成。但可能是,骆驼已经复制了文件,所以从它的角度来看它是一个空文件夹。无论如何要从骆驼得到这些信息吗? –

1

有时,使用我们在“前骆驼”时代中使用的古老Java堆栈会更容易。这就是说,做你自己的文件复制在单独Processor(或骆驼还没有意识豆):

@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); 
} 

对于文件的副本,该org.apache.commons.io.FileUtils从Apache Commons项目使用。

编辑:

由于@Petter正确地指出,这种解决方案,也没有必要创建和启动具有再次被关闭一个独立的路线。目录拷贝处理器可以被添加到触发拷贝的R1处理器中。

+1

好主意。这项工作的正确工具。然而,不知道这里骆驼东西增加了什么价值。 copyDirectory调用可能就足够了。 :) –

+0

@Petter你是绝对正确的,在这种情况下,没有必要创建一个单独的路线。文件复制处理器可以嵌入到'R1'路由中。 –

+0

@Peter:我已经添加了几个必须满足的约束,同时解决这个问题 –