2014-08-28 121 views
2

我有一个预计将各种文件复制到传入文件夹的路线。路线将继续移动这些文件到一个临时文件夹,在那里它会做其他的事情。路线如下:Apache Camel - 将大文件复制到使用者文件夹

 <route id="incoming" > 
      <from uri="file://my/path/incoming"/> 
      <to uri="file://my/path/incoming/temp"/> 
     </route> 

问题是这些文件可能相当大。可以说1Gb。为了将该文件复制到传入的文件夹中,可能需要10秒钟。在这10秒内,消费者轮询该目录,并且由于部分文件仍在被复制,所以抛出异常。我可以使用哪种解决方法?

我用readLock所有战略(主要是改变了),但我得到一个异常:

(The process cannot access the file because it is being used by another process) 

修改后的URI如下:

<from uri="file://my/file/path?readLockCheckInterval=3000&amp;readLock=changed"/> 

仍然没有运气虽然

+0

您的异常应该处理。例外是说它不能读取文件。通过处理例外,您可以例如停止路线,暂停,发送电子邮件,发送推文以支持或正确处理。不使用这些选项时,您没有收到正确的异常? – Namphibian 2014-09-01 02:12:40

+0

我面临同样的问题并寻找解决方案。 [latest documentation](http://camel.apache.org/file2.html)提到'changed ... readLockCheckInterval ...这个选项仅适用于Camel 2.8以后的FTP组件。不确定已更改或readLockCheckInterval或两者仅适用于FTP。 – ren78min 2015-09-06 20:14:16

回答

5

检查readLock选项File component

由消费者使用,只在文件具有独占读锁定时才轮询文件。该文件不在进行中或正在写入)。骆驼将等待,直到授予文件锁定。

此选项提供了策略构建:

markerFile骆驼创建一个标记文件(fileName.camelLock),然后在其持有的锁。

changed正在使用文件长度/修改时间戳来检测当前是否正在复制文件。至少会使用1秒。为了确定这一点,所以这个选项不能像其他进程一样使用文件,但可以更可靠,因为JDK IO API不能总是确定文件当前是否正在被另一个进程使用。 readLockCheckInterval选项可用于设置检查频率。

fileLock用于使用java.nio.channels.FileLock。在通过mount/share访问远程文件系统时,应避免使用此方法,除非该文件系统支持分布式文件锁定。

重命名是用于尝试重命名该文件作为测试,如果我们可以获得独占的读锁定。

+0

我试过所有这些策略,但没有任何运气。请检查更新并查看我正在使用的URI。 – ChrisGeo 2014-08-28 19:40:06

1

readLock =更改选项在这种情况下似乎是合适的。如果生产者将文件写入传入文件夹的速度非常慢,则可能会出现问题。

其他选项是使用完成的文件名。文件写入完成后,您可以让原始制作人员创建完成的文件。

其更常见的是每个目标文件具有一个完成的文件。这意味着有 1:1的相关性。为此,您必须在 doneFileName选项中使用动态占位符。目前Camel支持以下两个动态令牌: :file:name和file:name。noext必须在$ {}中包含 。消费者仅支持已完成文件名称的静态部分作为前缀或后缀(不是两者)。

from(“file:bar?doneFileName = $ {file:name} .done”);
在此示例中,如果存在具有名称文件 name.done的完成文件,则将仅查询文件。

1

这样的事情可以解决。如果它的NON-Camel系统正在将您的大文件复制到InputDir中,那么在复制文件之后,您必须小心创建.DONE文件。一旦.DONE文件可用,路由将开始处理。

from("file://" + InputDir + "?delay=500&doneFileName=${file:name}.DONE") 
    .to("file://" + OutputDir + "?fileName=${date:now:yyyyMMdd}/${file:name}&doneFileName=${file:name}.DATA.READY.DONE"); 
相关问题