使用 camel-smb SMB 拾取(大)文件,同时仍被写入

Using camel-smb SMB picks up (large) files while still be written to

当尝试创建循环移动文件时遇到了 readLock 的奇怪行为。创建一个大文件(大约 100Mb)并使用 SMB 将其从文件夹外传输到文件夹内。

发件人:

smb2://smbuser:****@localhost:4455/user/out?antInclude=FILENAME*&consumer.bridgeErrorHandler=true&delay=10000&inProgressRepository=%23inProgressRepository&readLock=changed&readLockMinLength=1&readLockCheckInterval=1000&readLockTimeout=5000&streamDownload=true&username=smbuser&delete=true

收件人:

smb2://smbuser:****@localhost:4455/user/in?username=smbuser

创建另一个流程以将文件从 IN 文件夹移回 OUT 文件夹。在一些传输之后,文件将被拾取,同时仍然被另一条路径写入,并且传输将使用更小的文件完成,导致目标文件不完整。

发件人:

smb2://smbuser:****@localhost:4455/user/in?antInclude=FILENAME*&delete=true&readLock=changed&readLockMinLength=1&readLockCheckInterval=1000&readLockTimeout=5000&streamDownload=false&delay=10000

收件人:

smb2://smbuser:****@localhost:4455/user/out

问题是:为什么我的 readLock 不能正常工作(p.s。需要 streamDownload)?

UPDATE:原来这只发生在 windows samba 共享上,并且 streamDownload=true。所以,有流分块的东西。欢迎任何建议。

解决方案需要防止轮询策略自动获取文件,并了解另一端的 readLock(进行中)。所以我将延迟降低到 5 秒,在 FROM 部分,在两侧,我将 readLockMinAge 添加到 5s,这将检查文件修改时间。 由于流式传输每秒进行一次,因此这足以防止读取锁定。

为什么会出现上述情况的解释:

  1. 当路由准备从 out 文件夹到 pick-up 时,一个大文件 (1GB) in progress chunk by块到文件夹中。在流文件的末尾标记为 camel-smbj 删除,文件接收状态 STATUS_DELETE_PENDING。
  2. 现在此过程的另一部分开始将新到达的文件发送到 out 文件夹并发现该文件已经存在。因为默认的fileExists=Override策略 它尝试删除(之后存储)现有文件(仍未从上一步中删除)并接收到导致某些 InputStream 的异常 要丢失的块。