参考:https://blog.csdn.net/tiantian12234/article/details/77942598
不支持绝对路径。骆驼通过修剪所有的前斜线将绝对路径转换为相对路径directoryname
。日志中将显示警告消息。
Maven用户将需要为其组件添加以下依赖项pom.xml
:
<dependency>
<groupId>org.apache.camelgroupId>
<artifactId>camel-ftpartifactId>
<version>x.x.xversion>See the documentation of the Apache Commons
dependency>
ftp://[username@]hostname[:port]/directoryname[?options]
sftp://[username@]hostname[:port]/directoryname[?options]
ftps://[username@]hostname[:port]/directoryname[?options]
其中directoryname表示基础目录。目录名称是相对路径。不支持绝对路径。相对路径可以包含嵌套文件夹,例如/ inbox / us。
autoCreate
支持该选项。使用方启动时,在计划轮询之前,将执行其他FTP操作,以创建为端点配置的目录。其缺省值autoCreate
是true
。
如果未提供用户名,则anonymous
尝试不使用密码登录。
如果未提供端口号,则Camel将根据协议提供默认值(ftp = 21,sftp = 22,ftps = 2222)。
您可以按以下格式将查询选项附加到URI, ?option=value&option=value&…
该组件使用两个不同的库来进行实际的FTP工作。FTP和FTPS使用Apache Commons Net,而SFTP使用JCraft JSCH。
FTPS(也称为FTP安全)是FTP的扩展,它添加了
支持传输层安全性(TLS)和安全套接字
层(SSL)加密协议。
以下选项是FTP组件专用的。
FTP组件支持3个选项,如下所示。
名称 | 描述 | 默认 | 类型 |
---|---|---|---|
basicPropertyBinding(高级) |
组件应使用基本属性绑定(Camel 2.x)还是具有附加功能的较新属性绑定 |
假 |
布尔值 |
lazyStartProducer(生产者) |
生产者是否应该开始懒惰(在第一个消息上)。通过延迟启动,您可以使用它来允许CamelContext和路由启动,以防生产者在启动过程中否则可能失败并导致路由启动失败。通过延迟启动时间,可以在通过Camel的路由错误处理程序路由消息期间处理启动失败。请注意,当处理第一个消息时,创建并启动生产者可能会花费一些时间,并会延长处理的总处理时间。 |
假 |
布尔值 |
bridgeErrorHandler(消费者) |
允许将使用者桥接到Camel路由错误处理程序,这意味着在使用者尝试提取传入消息或类似消息时发生的任何异常现在都将作为消息处理,并由路由错误处理程序进行处理。默认情况下,使用者将使用org.apache.camel.spi.ExceptionHandler处理异常,这些异常将以WARN或ERROR级别记录并被忽略。 |
假 |
布尔值 |
使用URI语法配置FTP端点:
ftp:主机:端口/目录名称
具有以下路径和查询参数:
名称 | 描述 | 默认 | 类型 |
---|---|---|---|
主办 |
FTP服务器的必需主机名 |
串 |
|
港口 |
FTP服务器的端口 |
整型 |
|
directoryName |
起始目录 |
串 |
名称 | 描述 | 默认 | 类型 |
---|---|---|---|
二进制(通用) |
指定文件传输模式,BINARY或ASCII。默认值为ASCII(false)。 |
假 |
布尔值 |
字符集(常见) |
此选项用于指定文件的编码。您可以在使用者上使用它来指定文件的编码,从而使Camel知道在访问文件内容的情况下应该加载文件内容的字符集。同样,在写入文件时,您可以使用此选项来指定也要写入文件的字符集。请注意,在编写文件时,Camel可能必须将消息内容读入内存才能将数据转换为已配置的字符集,因此,如果您有大消息,请不要使用它。 |
串 |
|
断开连接(常见) |
使用后是否立即断开与远程FTP服务器的连接。断开连接只会断开当前与FTP服务器的连接。如果您有要停止的使用者,则需要停止使用者/路线。 |
假 |
布尔值 |
doneFileName(常见) |
生产者:如果提供,那么在原始文件被写入后,骆驼将写入第二完成文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者,您可以使用动态占位符。完成的文件将始终与原始文件写入相同的文件夹中。使用者:如果提供,则Camel仅在存在已完成文件的情况下才使用文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者,您可以使用动态占位符。完成的文件总是与原始文件位于同一文件夹中。只支持\ $ {file.name}和\ $ {file.name.noext}作为动态占位符。 |
串 |
|
fileName(常见) |
使用诸如文件语言之类的表达式来动态设置文件名。对于使用者,它用作文件名过滤器。对于生产者,它用于评估要写入的文件名。如果设置了表达式,则其优先级高于CamelFileName标头。(注意:标头本身也可以是一个表达式)。表达式选项同时支持字符串和表达式类型。如果表达式是字符串类型,则始终使用文件语言对其求值。如果表达式是表达式类型,则使用指定的表达式类型-例如,这允许您使用OGNL表达式。对于使用者,您可以使用它来过滤文件名,因此您可以使用文件语言语法例如mydata-\ $ {date:now:yyyyMMdd} .txt来使用今天的文件。生产者支持CamelOverruleFileName头,该头优先于任何现有的CamelFileName头;CamelOverruleFileName是仅使用一次的标头,它使它更容易,因为它避免了临时存储CamelFileName并随后必须将其还原。 |
串 |
|
PassiveMode(常见) |
设置被动模式连接。默认为活动模式连接。 |
假 |
布尔值 |
分隔符(常见) |
设置要使用的路径分隔符。UNIX =使用unix样式路径分隔符Windows =使用Windows样式路径分隔符Auto =(默认值)在文件名中使用现有路径分隔符 |
UNIX系统 |
路径分隔符 |
transferLoggingInterval秒(常见) |
配置记录正在进行的上载和下载操作进度时使用的时间间隔(以秒为单位)。当操作花费更长的时间时,这用于记录进度。 |
5 |
整型 |
transferLoggingLevel(常见) |
配置在记录上载和下载操作进度时使用的记录级别。 |
调试 |
记录级别 |
transferLoggingVerbose(常见) |
配置是否对上传和下载操作的进度执行详细(细粒度)日志记录。 |
假 |
布尔值 |
fastExistsCheck(常见) |
如果将此选项设置为true,则camel- \ ftp将直接使用列表文件来检查文件是否存在。由于某些FTP服务器可能不支持直接列出文件,因此,如果该选项为false,则camel- \ ftp将使用旧方法列出目录并检查文件是否存在。此选项还会影响readLock = changed以控制它是否执行快速检查以更新文件信息。如果FTP服务器上有很多文件,这可以用来加快处理过程。 |
假 |
布尔值 |
bridgeErrorHandler(消费者) |
允许将使用者桥接到Camel路由错误处理程序,这意味着在使用者尝试提取传入消息或类似消息时发生的任何异常现在都将作为消息处理,并由路由错误处理程序进行处理。默认情况下,使用者将使用org.apache.camel.spi.ExceptionHandler处理异常,这些异常将以WARN或ERROR级别记录并被忽略。 |
假 |
布尔值 |
删除(消费者) |
如果为true,则文件将在成功处理后被删除。 |
假 |
布尔值 |
moveFailed(消费者) |
根据简单语言设置移动失败表达。例如,要将文件移动到.error子目录,请使用:.error。注意:将文件移动到失败位置时,Camel将处理错误,并且不会再次拾取文件。 |
串 |
|
无(消费者) |
如果为true,则不会以任何方式移动或删除文件。该选项适用于只读数据或ETL类型要求。如果noop = true,Camel也将设置idempotent = true,以避免重复使用相同的文件。 |
假 |
布尔值 |
preMove(消费者) |
用于在处理之前移动文件名时动态设置文件名的表达式(例如文件语言)。例如,要将正在进行的文件移动到订单目录中,请将此值设置为order。 |
串 |
|
preSort(消费者) |
启用预排序后,使用者将在轮询期间对从文件系统检索到的文件和目录名称进行排序。如果您需要对文件进行排序,则可能需要这样做。预排序是在使用者开始过滤之前执行的,并接受文件以供Camel处理。此选项为default = false,表示已禁用。 |
假 |
布尔值 |
递归(消费者) |
如果是目录,还将在所有子目录中查找文件。 |
假 |
布尔值 |
简历下载(消费者) |
配置是否启用恢复下载。FTP服务器必须支持此功能(几乎所有FTP服务器都支持它)。另外,必须配置选项localWorkDirectory,以便将下载的文件存储在本地目录中,并且必须启用选项二进制文件,这是支持恢复下载所必需的。 |
假 |
布尔值 |
sendEmptyMessageWhenIdle(消费者) |
如果轮询使用者未轮询任何文件,则可以启用此选项以发送空消息(无正文)。 |
假 |
布尔值 |
streamDownload(消费者) |
设置不使用本地工作目录时要使用的下载方法。如果设置为true,则远程文件在读取时将流传输到路由。设置为false时,将远程文件加载到内存中,然后再发送到路由中。 |
假 |
布尔值 |
下载(消费者) |
FTP使用者是否应下载文件。如果将此选项设置为false,则消息正文将为null,但是使用者仍将触发具有有关文件详细信息(例如文件名,文件大小等)的Camel Exchange。只是文件不会被下载。 。 |
假 |
布尔值 |
exceptionHandler(消费者) |
让使用者使用自定义的ExceptionHandler。请注意,如果启用了选项bridgeErrorHandler,则该选项未使用。默认情况下,使用者将处理异常,这些异常将以WARN或ERROR级别记录并被忽略。 |
异常处理程序 |
|
exchangePattern(消费者) |
消费者创建交换时设置交换模式。 |
交换模式 |
|
handleDirectoryParser AbsoluteResult(消费者) |
允许您设置如果目录解析器以绝对路径生成结果时使用者如何处理路径中的子文件夹和文件。原因是某些FTP服务器可能会返回带有绝对路径的文件名,如果这样,则FTP组件需要通过将返回的路径转换为相对路径来解决此问题。 |
假 |
布尔值 |
ignoreFileNotFoundOr PermissionError(消费者) |
是否忽略(由于试图列出目录中的文件或下载文件时)不存在或由于权限错误而忽略的时间。默认情况下,当目录或文件不存在或权限不足时,将引发异常。将此选项设置为true可以忽略它。 |
假 |
布尔值 |
inProgressRepository(消费者) |
可插入的正在进行的存储库org.apache.camel.spi.IdempotentRepository。进行中的存储库用于说明正在消耗的当前进行中的文件。默认情况下,使用基于内存的存储库。 |
幂等存储库 |
|
localWorkDirectory(消费者) |
使用时,可以使用本地工作目录将远程文件内容直接存储在本地文件中,以避免将内容加载到内存中。如果您使用了很大的远程文件,从而节省了内存,那么这将是有益的。 |
串 |
|
onCompletionException处理程序(消费者) |
若要使用自定义org.apache.camel.spi.ExceptionHandler来处理在使用者完成提交或回滚的文件在完成过程中发生的任何引发的异常。默认实现将在WARN级别记录任何异常并忽略。 |
异常处理程序 |
|
pollStrategy(消费者) |
可插入的org.apache.camel.PollingConsumerPollingStrategy允许您提供自定义实现,以控制通常在轮询操作过程中发生的错误处理,而错误操作是在创建和路由Camel之前进行的。 |
轮询消费者轮询策略 |
|
processStrategy(消费者) |
可插入的org.apache.camel.component.file.GenericFileProcessStrategy,允许您实现自己的readLock选项或类似选项。当必须满足特殊条件才能使用文件时,也可以使用它,例如存在特殊的就绪文件。如果设置了此选项,则readLock选项不适用。 |
GenericFileProcessStrategy |
|
useList(消费者) |
下载文件时是否允许使用LIST命令。默认为true。在某些情况下,您可能要下载特定文件,并且不允许使用LIST命令,因此可以将此选项设置为false。请注意,使用此选项时,要下载的特定文件不包含元数据信息,例如文件大小,时间戳,权限等,因为只有在使用LIST命令时才能检索这些信息。 |
真正 |
布尔值 |
fileExist(生产者) |
如果已经存在同名文件该怎么办。覆盖是默认设置,它将替换现有文件。-附加-将内容添加到现有文件。-失败-引发GenericFileOperationException,指示已经存在一个文件。-忽略-静默忽略该问题,不覆盖现有文件,但假定一切正常。-移动-选项还需要使用moveExisting选项进行配置。选项eagerDeleteTargetFile可用于控制在移动文件并且已经存在现有文件的情况下的处理方式,否则会导致移动操作失败。在写入目标文件之前,“移动”选项将移动所有现有文件。-TryRename仅在使用tempFileName选项时适用。这样可以尝试将文件从临时名称重命名为实际名称,不做任何存在检查。在某些文件系统,尤其是FTP服务器上,此检查可能会更快。 |
覆写 |
GenericFileExist |
展平(生产者) |
Flatten用于展平文件名路径以去除所有前导路径,因此它只是文件名。这使您可以递归地使用子目录,但是当您将文件写入另一个目录时,它们将被写入单个目录中。在生产者上将此设置为true会强制删除CamelFileName标头中的所有文件名,以排除所有前导路径。 |
假 |
布尔值 |
jailStartingDirectory(生产者) |
仅用于约束(限制)将文件写入起始目录(和子目录)。默认情况下启用此功能,不允许Camel将文件写入外部目录(开箱即用)。您可以关闭此选项以允许将文件写入起始目录之外的目录,例如父文件夹或根文件夹。 |
真正 |
布尔值 |
lazyStartProducer(生产者) |
生产者是否应该开始懒惰(在第一个消息上)。通过延迟启动,您可以使用它来允许CamelContext和路由启动,以防生产者在启动过程中否则可能失败并导致路由启动失败。通过延迟启动时间,可以在通过Camel的路由错误处理程序路由消息期间处理启动失败。请注意,当处理第一个消息时,创建并启动生产者可能会花费一些时间,并会延长处理的总处理时间。 |
假 |
布尔值 |
moveExisting(生产者) |
表达式(例如文件语言),用于在配置fileExist = Move时计算要使用的文件名。要将文件移动到备份子目录中,只需输入backup。此选项仅支持以下文件语言标记:file:name,file:name.ext,file:name.noext,file:onlyname,file:onlyname.noext,file:ext和file:parent。请注意,FTP组件不支持file:parent,因为FTP组件只能将任何现有文件移动到基于当前目录为基础的相对目录。 |
串 |
|
tempFileName(生产者) |
与tempPrefix选项相同,但由于它使用文件语言,因此提供了对临时文件名命名的更精细控制。tempFilename的位置相对于选项'fileName'中的最终文件位置,而不是基本uri中的目标目录。例如,如果选项fileName包含目录前缀:dir / finalFilename,则tempFileName相对于该子目录dir。 |
串 |
|
tempPrefix(生产者) |
此选项用于使用临时名称写入文件,然后在写入完成后将其重命名为真实名称。可以用于标识正在写入的文件,也可以避免使用者(不使用排他读取锁)读取正在进行的文件。FTP在上传大文件时经常使用。 |
串 |
|
allowNullBody(生产者) |
用于指定在文件写入期间是否允许使用空主体。如果设置为true,则将创建一个空文件,当设置为false时,将尝试向文件组件发送空正文,GenericFileWriteException为“无法将空正文写入文件”。将被抛出。如果fileExist选项设置为'Override',则文件将被截断,如果设置为追加,则文件将保持不变。 |
假 |
布尔值 |
chmod(生产者) |
允许您在存储的文件上设置chmod。例如chmod = 640。 |
串 |
|
offlineOnBatchComplete(生产者) |
批量上传完成后是否立即断开与远程FTP服务器的连接。detachOnBatchComplete将仅断开与FTP服务器的当前连接。 |
假 |
布尔值 |
eagerDeleteTargetFile(生产者) |
是否急切删除任何现有目标文件。仅当您使用fileExists = Override和tempFileName选项时,此选项才适用。您可以使用它来禁用(将其设置为false)在写入临时文件之前删除目标文件。例如,您可能编写了大文件,并希望目标文件在临时文件写入过程中存在。这样可以确保仅在将临时文件重命名为目标文件名之前的最后一刻才删除目标文件。此选项还用于控制在启用fileExist = Move并且存在现有文件时是否删除任何现有文件。如果此选项copyAndDeleteOnRenameFails为false,则如果存在现有文件,则将引发异常;如果为true,则将在移动操作之前删除现有文件。 |
真正 |
布尔值 |
keepLastModified(生产者) |
将保留源文件中最后修改的时间戳(如果有)。将使用Exchange.FILE_LAST_MODIFIED标头来定位时间戳。此标头可以包含java.util.Date或带时间戳的long。如果时间戳存在并且启用了该选项,它将在写入文件上设置该时间戳。注意:此选项仅适用于文件生产者。您不能对任何\ ftp生产者使用此选项。 |
假 |
布尔值 |
moveExistingFileStrategy(生产者) |
策略(自定义策略),用于移动带有特殊命名标记的文件,以便在配置fileExist = Move时使用。默认情况下,如果未提供自定义策略,则使用一个实现 |
FileMoveExistingStrategy |
|
sendNoop(生产者) |
在将文件上传到FTP服务器之前是否发送noop命令作为预写检查。默认情况下启用此选项,因为对连接的验证仍然有效,这允许静默重新连接以便能够上载文件。但是,如果这引起问题,则可以关闭此选项。 |
真正 |
布尔值 |
activePortRange(高级) |
将客户端端口范围设置为活动模式。语法为:minPort-maxPort两个端口号都包含在内,例如10000-19999以包括所有1xxxx端口。 |
串 |
|
自动创建(高级) |
在文件的路径名中自动创建缺少的目录。对于文件使用者,这意味着创建起始目录。对于文件生产者,这意味着应该将文件写入的目录。 |
真正 |
布尔值 |
basicPropertyBinding(高级) |
端点应使用基本属性绑定(Camel 2.x)还是具有附加功能的较新属性绑定 |
假 |
布尔值 |
bufferSize(高级) |
用于写入文件的缓冲区大小(以字节为单位)(如果使用FTP下载和上传文件,则以字节为单位)。 |
131072 |
整型 |
connectTimeout(高级) |
设置等待连接建立的连接超时,由FTPClient和JSCH使用 |
10000 |
整型 |
ftpClient(高级) |
使用FTPClient的自定义实例 |
FTP客户端 |
|
ftpClientConfig(高级) |
要使用FTPClientConfig的自定义实例来配置端点应使用的FTP客户端。 |
FTP客户端配置 |
|
ftpClientConfigParameters(高级) |
由FtpComponent使用以为FTPClientConfig提供其他参数 |
地图 |
|
ftpClientParameters(高级) |
由FtpComponent使用以为FTPClient提供其他参数 |
地图 |
|
maximumReconnectAttempts(高级) |
指定Camel尝试连接到远程FTP服务器时执行的最大重新连接尝试次数。使用0禁用此行为。 |
整型 |
|
reconnectDelay(高级) |
延迟毫秒后,骆驼会在尝试重新连接之前等待。 |
长 |
|
siteCommand(高级) |
设置在成功登录后执行的可选站点命令。可以使用换行符分隔多个站点命令。 |
串 |
|
soTimeout(高级) |
为Camel 2.4设置so超时FTP和FTPS。从SFTP for Camel 2.14.3 / 2.15.3 / 2.16开始。是SocketOptions.SO_TIMEOUT的值,以毫秒为单位。推荐的选项是将此值设置为300000,以使它没有挂起的连接。在SFTP上,此选项在JSCH会话实例上设置为超时。 |
300000 |
整型 |
逐步(高级) |
设置在下载文件时或遍历文件结构时遍历文件结构时是否应该逐步更改目录。例如,由于安全原因而无法更改FTP服务器上的目录时,可以禁用此功能。 |
真正 |
布尔值 |
同步(高级) |
设置是否应严格使用同步处理,还是允许Camel使用异步处理(如果支持)。 |
假 |
布尔值 |
throwExceptionOnConnect失败(高级) |
如果连接失败(已用尽),则应引发异常。默认情况下,不引发异常并记录WARN。您可以使用此方法启用引发异常并处理org.apache.camel.spi.PollingConsumerPollStrategy回滚方法中引发的异常。 |
假 |
布尔值 |
超时(高级) |
设置等待应答的数据超时,仅由FTPClient使用 |
30000 |
整型 |
antExclude(过滤器) |
蚂蚁样式过滤器排除。如果同时使用antInclude和antExclude,则antExclude优先于antInclude。可以用逗号分隔的格式指定多个排除项。 |
串 |
|
antFilterCaseSensitive(过滤器) |
在蚂蚁过滤器上设置区分大小写的标志 |
真正 |
布尔值 |
antInclude(过滤器) |
包含蚂蚁样式的过滤器。可以用逗号分隔的格式指定多个包含。 |
串 |
|
eagerMaxMessagesPerPoll(过滤器) |
允许控制maxMessagesPerPoll的限制是否急切。如果渴望,则限制是在文件扫描期间。如果为false,则将扫描所有文件,然后执行排序。将此选项设置为false允许首先对所有文件进行排序,然后限制轮询。请注意,这需要更高的内存使用量,因为所有文件详细信息都在内存中才能执行排序。 |
真正 |
布尔值 |
排除(过滤器) |
如果文件名与正则表达式模式匹配(用于区分大小写),则用于排除文件。请注意,如果您使用加号等符号,并且将其配置为端点uri,则需要使用RAW()语法进行配置。在配置端点uri时查看更多详细信息 |
串 |
|
过滤器(filter) |
可插入过滤器,作为org.apache.camel.component.file.GenericFileFilter类。如果filter在accept()方法中返回false,将跳过文件。 |
通用文件过滤器 |
|
filterDirectory(过滤器) |
根据简单语言过滤目录。例如,要过滤当前日期,可以使用简单的日期模式,例如\ $ {date:now:yyyMMdd} |
串 |
|
filterFile(过滤器) |
根据简单语言过滤文件。例如,要过滤文件大小,可以使用\ $ {file:size} 5000 |
串 |
|
幂等(过滤器) |
选择使用幂等消费者EIP模式让Camel跳过已经处理的文件。默认情况下,将使用可容纳1000个条目的基于内存的LRUCache。如果noop = true,则将启用幂等,以避免重复使用相同的文件。 |
假 |
布尔型 |
idempotentKey(过滤器) |
使用自定义幂等键。默认情况下,使用文件的绝对路径。您可以使用文件语言,例如使用文件名和文件大小,可以执行以下操作:idempotentKey = \ $ {file:name}-\ $ {file:size} |
串 |
|
idempotentRepository(过滤器) |
可插拔的存储库org.apache.camel.spi.IdempotentRepository,如果未指定任何存储库且幂等为true,则默认情况下使用MemoryMessageIdRepository。 |
幂等存储库 |
|
包含(过滤器) |
如果文件名与正则表达式模式匹配(用于区分大小写),则用于包含文件。请注意,如果您使用加号等符号,并且将其配置为端点uri,则需要使用RAW()语法进行配置。在配置端点uri时查看更多详细信息 |
串 |
|
maxDepth(过滤器) |
递归处理目录时要遍历的最大深度。 |
2147483647 |
整型 |
maxMessagesPerPoll(过滤器) |
定义每次轮询收集的最大消息数。默认情况下,未设置最大值。可以用来设置例如1000的限制,以避免在启动服务器时有成千上万个文件。将值设置为0或负数可将其禁用。注意:如果使用此选项,则在进行任何排序之前,文件和FTP组件将受到限制。例如,如果您有100000个文件并使用maxMessagesPerPoll = 500,则仅将提取前500个文件,然后进行排序。您可以使用eagerMaxMessagesPerPoll选项并将其设置为false以允许先扫描所有文件,然后再进行排序。 |
整型 |
|
minDepth(过滤器) |
递归处理目录时开始处理的最小深度。使用minDepth = 1表示基本目录。使用minDepth = 2表示第一个子目录。 |
整型 |
|
移动(过滤器) |
用于在处理后移动文件名时动态设置文件名的表达式(例如“简单语言”)。要将文件移动到.done子目录,只需输入.done。 |
串 |
|
ExclusiveReadLockStrategy(锁定) |
可插入的读锁作为org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy实现。 |
GenericFileExclusiveReadLockStrategy |
|
readLock(锁定) |
使用者使用,仅在文件具有独占读锁定(即文件不在进行中或未被写入)时才轮询文件。骆驼将等待,直到授予文件锁定。此选项提供了内置策略:-无-未使用读锁-markerFile-Camel创建一个标记文件(fileName.camelLock),然后对其保持锁。该选项不适用于FTP组件-已更改-已更改是使用文件长度/修改时间戳来检测当前是否正在复制文件。至少需要1秒钟来确定,所以此选项不能像其他文件一样快地消耗文件,但是可以更可靠,因为JDK IO API不能始终确定文件是否正在被另一个进程使用。选项readLockCheckInterval可用于设置检查频率。-fileLock-用于使用java.nio.channels.FileLock。该选项不适用于Windows操作系统和FTP组件。通过挂载/共享访问远程文件系统时,应避免这种方法,除非该文件系统支持分布式文件锁。-重命名-重命名是用于尝试重命名文件以测试是否可以获取独占读锁。-idempotent-(仅用于文件组件)idempotent用于将idempotentRepository用作读取锁。如果幂等存储库实现支持集群,则允许使用支持集群的读取锁。-idempotent-changed-(仅用于文件组件)idempotent-changed用于使用idempotentRepository,并更改为组合的读锁。如果幂等存储库实现支持集群,则允许使用支持集群的读取锁。-idempotent-rename-(仅用于文件组件)idempotent-rename用于使用idempotentRepository并将其重命名为组合的读锁。如果幂等存储库实现支持集群,则允许使用支持集群的读取锁。注意:各种读取锁并不都适合在集群模式下工作,在集群模式下,不同节点上的并发使用者正在争用共享文件系统上的相同文件。markerFile使用接近原子的操作来创建空的标记文件,但是不能保证它可以在集群中工作。fileLock可能会更好地工作,但是文件系统需要支持分布式文件锁,依此类推。如果幂等存储库支持群集(例如,Hazelcast Component或Infinispan),则使用幂等读锁定可以支持群集。 |
没有 |
串 |
readLockCheckInterval(锁定) |
读锁的间隔(以毫秒为单位)(如果读锁支持)。该间隔用于尝试获取读锁之间的休眠。例如,当使用更改的读取锁定时,可以设置较大的间隔时间以适应缓慢的写入。默认值为1秒。如果生产者写文件的速度很慢,则可能会太快。注意:对于FTP,默认的readLockCheckInterval为5000。readLockTimeout值必须大于readLockCheckInterval,但是根据经验,超时至少要比readLockCheckInterval高2倍或更多倍。这是为了确保在锁定超时之前允许读取锁定进程尝试获取锁的时间,以便尝试抓住该锁定。 |
1000 |
长 |
readLockDeleteOrphanLock文件(锁定) |
如果没有正确关闭Camel(例如JVM崩溃),则在启动时是否应删除带有标记文件的读取锁,否则应删除文件系统上可能留有的所有孤立读取锁文件。如果将此选项设置为false,则任何孤立的锁定文件都将导致Camel不尝试提取该文件,这也可能是由于另一个节点正在从同一共享目录中同时读取文件。 |
真正 |
布尔值 |
readLockLoggingLevel(锁定) |
无法获取读锁时使用的日志记录级别。默认情况下,将记录调试。您可以更改此级别,例如将其更改为“关闭”以不进行任何日志记录。此选项仅适用于类型为readLock的readLock:更改,fileLock,幂等,幂等更改,idempotent重命名,重命名。 |
调试 |
记录级别 |
readLockMarkerFile(锁定) |
是否将标记文件与已更改,重命名或排他读取锁定类型一起使用。默认情况下,还会使用标记文件来防止其他进程拾取相同文件。可以通过将此选项设置为false来关闭此行为。例如,如果您不想通过Camel应用程序将标记文件写入文件系统。 |
真正 |
布尔值 |
readLockMinAge(锁定) |
此选项仅适用于readLock = changed。它允许指定尝试获取读锁之前文件必须达到的最小期限。例如,使用readLockMinAge = 300s要求文件至少存在5分钟。这样可以加快更改后的读取锁定的速度,因为它只会尝试获取至少给定使用期限的文件。 |
0 |
长 |
readLockMinLength(锁定) |
此选项仅适用于readLock = changed。它允许您配置最小文件长度。默认情况下,Camel期望文件包含数据,因此默认值为1。您可以将此选项设置为零,以允许使用零长度的文件。 |
1个 |
长 |
readLockRemoveOnCommit(锁定) |
此选项仅适用于readLock =幂等。它允许指定在成功处理文件并发生提交时是否从幂等存储库中删除文件名条目。默认情况下,不会删除该文件,以确保不会发生任何竞争条件,因此另一个活动节点可能会尝试获取该文件。相反,幂等存储库可能支持逐出策略,您可以将其配置为在X分钟后逐出文件名条目-这样可以确保竞争条件不会出现问题。在readLockIdempotentReleaseDelay选项中查看更多详细信息。 |
假 |
布尔值 |
readLockRemoveOnRollback(锁定) |
此选项仅适用于readLock =幂等。它允许指定在处理文件失败并发生回滚时是否从幂等存储库中删除文件名条目。如果此选项为false,那么将确认文件名条目(就像文件已提交一样)。 |
真正 |
布尔值 |
readLockTimeout(锁定) |
如果读锁支持,则可选的超时值(以毫秒为单位)。如果无法授予读取锁并且触发了超时,则Camel将跳过该文件。在下一次轮询Camel时,将再次尝试该文件,这一次也许可以授予读取锁定。使用0或更低的值表示永远。当前fileLock,已更改和重命名支持超时。注意:对于FTP,默认的readLockTimeout值为20000,而不是10000。readLockTimeout值必须大于readLockCheckInterval,但是根据经验,超时至少要比readLockCheckInterval高2倍或更多倍。这是为了确保在锁定超时之前允许读取锁定进程尝试获取锁的时间,以便尝试抓住该锁定。 |
10000 |
长 |
backoffErrorThreshold(调度程序) |
在backoffMultipler插入之前应该发生的后续错误轮询的数量(由于某些错误而失败)。 |
整型 |
|
backoffIdleThreshold(调度程序) |
在backoffMultipler踢入之前应该发生的后续空闲轮询的数量。 |
整型 |
|
backoffMultiplier(调度程序) |
如果连续出现多个随后的空闲/错误,则让计划的轮询使用者退回。乘数就是在下一次实际尝试再次发生之前将被跳过的轮询次数。使用此选项时,还必须配置backoffIdleThreshold和/或backoffErrorThreshold。 |
整型 |
|
延迟(调度程序) |
下次轮询之前的毫秒数。您还可以使用单位指定时间值,例如60s(60秒),5m30s(5分钟30秒)和1h(1小时)。 |
500 |
长 |
贪心(调度程序) |
如果启用了贪婪功能,则如果上一次运行轮询了1条或更多消息,则ScheduledPollConsumer将立即再次运行。 |
假 |
布尔值 |
initialDelay(调度程序) |
第一次轮询开始前的毫秒数。您还可以使用单位指定时间值,例如60s(60秒),5m30s(5分钟30秒)和1h(1小时)。 |
1000 |
长 |
repeatCount(调度程序) |
指定最大射击次数限制。因此,如果将其设置为1,则调度程序将仅触发一次。如果将其设置为5,则只会触发五次。零或负值表示永远开火。 |
0 |
长 |
runLoggingLevel(计划程序) |
使用者在轮询时记录开始/完成日志行。此选项使您可以为此配置日志记录级别。 |
跟踪 |
记录级别 |
cheduledExecutorService(调度程序) |
允许配置供使用者使用的自定义/共享线程池。默认情况下,每个使用者都有其自己的单线程线程池。 |
ScheduledExecutorService |
|
调度程序(调度程序) |
从骆驼弹簧或骆驼石英组件使用cron计划程序 |
没有 |
串 |
schedulerProperties(调度程序) |
要在使用自定义调度程序或任何基于Spring的Quartz调度程序时配置其他属性。 |
地图 |
|
startScheduler(调度程序) |
调度程序是否应自动启动。 |
真正 |
布尔值 |
timeUnit(调度程序) |
initialDelay和delay选项的时间单位。 |
千里眼 |
时间单位 |
useFixedDelay(计划程序) |
控制是否使用固定延迟或固定速率。有关详细信息,请参见JDK中的ScheduledExecutorService。 |
真正 |
布尔值 |
随机播放(排序) |
随机播放文件列表(以随机顺序排序) |
假 |
布尔值 |
sortBy(排序) |
使用文件语言的内置排序。支持嵌套排序,因此您可以按文件名进行排序,并作为第二组按修改日期进行排序。 |
串 |
|
分类器(排序) |
可插入排序器,作为java.util.Comparator类。 |
比较器 |
|
帐户(安全) |
用于登录的帐户 |
串 |
|
密码(安全性) |
登录密码 |
串 |
|
用户名(安全性) |
用于登录的用户名 |
串 |
使用Spring Boot时,请确保使用以下Maven依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springbootgroupId>
<artifactId>camel-ftp-starterartifactId>
<version>x.x.xversion>
dependency>
该组件支持4个选项,如下所示。
名称 | 描述 | 默认 | 类型 |
---|---|---|---|
camel.component.ftp.basic-property-binding |
组件应使用基本属性绑定(Camel 2.x)还是具有附加功能的较新属性绑定 |
假 |
布尔型 |
camel.component.ftp.bridge-error-handler |
允许将使用者桥接到Camel路由错误处理程序,这意味着在使用者尝试提取传入消息或类似消息时发生的任何异常现在都将作为消息处理,并由路由错误处理程序进行处理。默认情况下,使用者将使用org.apache.camel.spi.ExceptionHandler处理异常,这些异常将以WARN或ERROR级别记录并被忽略。 |
假 |
布尔型 |
camel.component.ftp.enabled |
是否启用\ ftp组件的自动配置。默认情况下启用。 |
布尔型 |
|
camel.component.ftp.lazy-start-producer |
生产者是否应该开始懒惰(在第一个消息上)。通过延迟启动,您可以使用它来允许CamelContext和路由启动,以防生产者在启动过程中否则可能失败并导致路由启动失败。通过延迟启动时间,可以在通过Camel的路由错误处理程序路由消息期间处理启动失败。请注意,当处理第一个消息时,创建并启动生产者可能会花费一些时间,并会延长处理的总处理时间。 |
假 |
布尔型 |
在ftpClient.
FTPS组件中使用与SSL相关的属性时,信任存储区将接受所有证书。如果只需要信任选择证书,则必须使用ftpClient.trustStore.xxx
选项或通过配置custom 来配置信任库ftpClient
。
使用时sslContextParameters
,信任库由提供的SSLContextParameters实例的配置管理。
您可以使用或前缀直接在URI ftpClient
和上配置其他选项。ftpClientConfig
ftpClient.
ftpClientConfig.
例如设定setDataTimeout
在FTPClient
30秒,你可以这样做:
from("ftp://foo@myserver?password=secret&ftpClient.dataTimeout=30000").to("bean:foo");
您可以混合使用两个前缀,例如配置日期格式或时区。
from("ftp://foo@myserver?password=secret&ftpClient.dataTimeout=30000&ftpClientConfig.serverLanguageCode=fr").to("bean:foo");
您可以根据需要选择任意多个选项。
有关可能的选项和更多详细信息,请参见Apache Commons FTP FTPClientConfig的文档。以及Apache Commons FTP FTPClient。
如果您不喜欢在URL中进行大量配置,则可以通过在注册表中进行骆驼查找来引用ftpClient
或ftpClientConfig
使用。
例如:
"myConfig"
class="org.apache.commons.net.ftp.FTPClientConfig">
"lenientFutureDates" value="true"/>
"serverLanguageCode" value="fr"/>
然后,当您在URL中使用#表示法时,让Camel查找该bean。
from("ftp://foo@myserver?password=secret&ftpClientConfig=#myConfig").to("bean:foo");
ftp://[email protected]/public/upload/images/holiday2008?password = secret&binary = true
ftp://[email protected]:12049 / reports / 2008 / password = secret&binary = false
ftp://publicftpserver.com/download
FTP使用者不支持并发
FTP使用者(具有相同的端点)不支持并发(后备FTP客户端不是线程安全的)。
您可以使用多个FTP使用者从不同的端点进行轮询。它只是一个不支持并发使用者的端点。
该FTP制片人并没有这个问题,它支持并发。
该组件是File组件的扩展。因此,“文件组件”页面上有更多示例和详细信息。
默认情况下,FTP使用者将在远程FTP服务器上保留使用过的文件。如果要删除文件或将其移动到其他位置,则必须对其进行显式配置。例如,您可以用于delete=true
删除文件,或用于move=.done
将文件移动到隐藏的完成子目录中。
常规文件使用者不同,因为默认情况下它将将文件移动到.camel
子目录。默认情况下,Camel 对于FTP使用者不执行此操作的原因是,默认情况下,它可能缺少权限才能移动或删除文件。
选项readLock可用于强制Camel 不使用当前正在写入的文件。但是,此选项默认情况下处于关闭状态,因为它要求用户具有写访问权限。有关读取锁的更多详细信息,请参见File2的选项表。
还有其他解决方案可以避免消耗当前正在通过FTP写入的文件。例如,您可以写入临时目标并在写入文件后移动它。
使用move
或preMove
选项移动文件时,文件仅限于FTP_ROOT文件夹。这样可以防止您将文件移到FTP区域之外。如果要将文件移动到另一个区域,则可以使用软链接并将文件移动到软链接文件夹中。
以下消息头可用于影响组件的行为
标头 | 描述 |
---|---|
|
指定当发送到端点时用于输出消息的输出文件名(相对于端点目录)。如果不存在且也没有表达式,则将生成的消息ID用作文件名。 |
|
写入的输出文件的实际文件路径(路径+名称)。此标头由Camel设置,其目的是向最终用户提供所写文件的名称。 |
|
当前批次中消耗的文件总数中的当前索引。 |
|
此批次中消耗的文件总数。 |
|
远程主机名。 |
|
本地工作文件的路径(如果使用本地工作目录)。 |
此外,FTP / FTPS使用者和生产者还将Message
使用以下标头来丰富Camel
标头 | 描述 |
---|---|
|
FTP客户端回复代码(类型为整数) |
|
FTP客户端回复字符串 |
两组库(请参见顶部)具有用于设置超时的不同API。您可以使用它们的connectTimeout
选项以毫秒为单位设置超时以建立网络连接。soTimeout
也可以在FTP / FTPS上设置个人,这与使用相对应ftpClient.soTimeout
。注意SFTP将自动connectTimeout
用作其soTimeout
。该timeout
选项仅适用于FTP / FTPS作为数据超时,与ftpClient.dataTimeout
值对应。所有超时值均以毫秒为单位。
Camel支持使用远程FTP服务器,并将文件直接下载到本地工作目录中。这样可以避免将整个远程文件内容读入内存,因为使用可以将其直接流式传输到本地文件中FileOutputStream
。
Camel将以与远程文件相同的名称存储到本地文件,尽管.inprogress
在下载文件时将其扩展名。之后,文件被重命名以删除.inprogress
后缀。最后,当Exchange完成时,将删除本地文件。
因此,如果要从远程FTP服务器下载文件并将其存储为文件,则需要路由到文件端点,例如:
from("ftp://[email protected]?password=secret&localWorkDirectory=/tmp").to("file://inbox");
===上面的路由非常高效,因为它避免了将整个文件内容读取到内存中。它将远程文件直接下载到本地文件流。java.io.File 然后将句柄用作Exchange正文。文件生产者利用这一事实,可以直接在工作文件java.io.File 句柄上工作java.io.File.rename ,并对目标文件名执行a操作。正如Camel所知,它是本地工作文件,它可以优化并使用重命名而不是文件副本,因为无论如何该工作文件都将被删除。=== |
在使用文件(例如下载)或生成文件(例如上传)时,就目录遍历而言,骆驼FTP可以在两种模式下运行
逐步地
不是逐步的
您可能要根据自己的情况和安全问题选择其中一个。某些骆驼最终用户只有在逐步使用的情况下才能下载文件,而其他骆驼最终用户只有在不逐步使用的情况下才能下载。
您可以使用该stepwise
选项来控制行为。
请注意,在大多数情况下,仅当用户限于其主目录并且主目录报告为时,才可以逐步更改目录"/"
。
最好用一个例子来说明两者之间的区别。假设我们在远程FTP服务器上具有以下目录结构,我们需要遍历和下载文件:
/
/one
/one/two
/one/two/sub-a
/one/two/sub-b
并且我们在sub-a(a.txt)和sub-b(b.txt)文件夹中都有一个文件。
TYPE A
200 Type set to A
PWD
257 "/" is current directory.
CWD one
250 CWD successful. "/one" is current directory.
CWD two
250 CWD successful. "/one/two" is current directory.
SYST
215 UNIX emulated by FileZilla
PORT 127,0,0,1,17,94
200 Port command successful
LIST
150 Opening data channel for directory list.
226 Transfer OK
CWD sub-a
250 CWD successful. "/one/two/sub-a" is current directory.
PORT 127,0,0,1,17,95
200 Port command successful
LIST
150 Opening data channel for directory list.
226 Transfer OK
CDUP
200 CDUP successful. "/one/two" is current directory.
CWD sub-b
250 CWD successful. "/one/two/sub-b" is current directory.
PORT 127,0,0,1,17,96
200 Port command successful
LIST
150 Opening data channel for directory list.
226 Transfer OK
CDUP
200 CDUP successful. "/one/two" is current directory.
CWD /
250 CWD successful. "/" is current directory.
PWD
257 "/" is current directory.
CWD one
250 CWD successful. "/one" is current directory.
CWD two
250 CWD successful. "/one/two" is current directory.
PORT 127,0,0,1,17,97
200 Port command successful
RETR foo.txt
150 Opening data channel for file transfer.
226 Transfer OK
CWD /
250 CWD successful. "/" is current directory.
PWD
257 "/" is current directory.
CWD one
250 CWD successful. "/one" is current directory.
CWD two
250 CWD successful. "/one/two" is current directory.
CWD sub-a
250 CWD successful. "/one/two/sub-a" is current directory.
PORT 127,0,0,1,17,98
200 Port command successful
RETR a.txt
150 Opening data channel for file transfer.
226 Transfer OK
CWD /
250 CWD successful. "/" is current directory.
PWD
257 "/" is current directory.
CWD one
250 CWD successful. "/one" is current directory.
CWD two
250 CWD successful. "/one/two" is current directory.
CWD sub-b
250 CWD successful. "/one/two/sub-b" is current directory.
PORT 127,0,0,1,17,99
200 Port command successful
RETR b.txt
150 Opening data channel for file transfer.
226 Transfer OK
CWD /
250 CWD successful. "/" is current directory.
QUIT
221 Goodbye
disconnected.
如您所见,启用了stepwise后,它将使用CD xxx遍历目录结构。
230 Logged on
TYPE A
200 Type set to A
SYST
215 UNIX emulated by FileZilla
PORT 127,0,0,1,4,122
200 Port command successful
LIST one/two
150 Opening data channel for directory list
226 Transfer OK
PORT 127,0,0,1,4,123
200 Port command successful
LIST one/two/sub-a
150 Opening data channel for directory list
226 Transfer OK
PORT 127,0,0,1,4,124
200 Port command successful
LIST one/two/sub-b
150 Opening data channel for directory list
226 Transfer OK
PORT 127,0,0,1,4,125
200 Port command successful
RETR one/two/foo.txt
150 Opening data channel for file transfer.
226 Transfer OK
PORT 127,0,0,1,4,126
200 Port command successful
RETR one/two/sub-a/a.txt
150 Opening data channel for file transfer.
226 Transfer OK
PORT 127,0,0,1,4,127
200 Port command successful
RETR one/two/sub-b/b.txt
150 Opening data channel for file transfer.
226 Transfer OK
QUIT
221 Goodbye
disconnected.
如您所见,当不逐步使用时,根本不会调用CD操作。
在下面的示例中,我们将Camel设置为每小时(60分钟)一次从FTP服务器下载所有报告作为BINARY内容,并将其作为文件存储在本地文件系统中。
以及使用Spring DSL的路由:
<route>
<from uri="ftp://scott@localhost/public/reports?password=tiger&binary=true&delay=60000"/>
<to uri="file://target/test-reports"/>
route>
from("ftps://admin@localhost:2222/public/camel?password=admin&securityProtocol=SSL&isImplicit=true
&ftpClient.keyStore.file=./src/test/resources/server.jks
&ftpClient.keyStore.password=password&ftpClient.keyStore.keyPassword=password")
.to("bean:foo");
from("ftps://admin@localhost:2222/public/camel?password=admin&ftpClient.trustStore.file=./src/test/resources/server.jks&ftpClient.trustStore.password=password")
.to("bean:foo");
骆驼支持可插拔过滤策略。这种策略使其org.apache.camel.component.file.GenericFileFilter
在Java中使用内置。然后,可以使用此类过滤器配置端点,以在处理之前跳过某些过滤器。
在示例中,我们构建了自己的过滤器,该过滤器仅接受文件名中以report开头的文件。
然后,我们可以使用filter属性配置路由,以引用我们#
在spring XML文件中定义的过滤器(使用符号):
<bean id="myFilter" class="com.mycompany.MyFileFilter"/>
<route>
<from uri="ftp://[email protected]?password=secret&filter=#myFilter"/>
<to uri="bean:processInbox"/>
route>
ANT路径匹配器是一个过滤器,它是开箱即用地装入骆驼弹簧罐中的。因此,如果您使用的是Maven,则需要依靠骆驼弹簧。
原因是我们利用Spring的AntPathMatcher进行实际匹配。
文件路径与以下规则匹配:
?
匹配一个字符
*
匹配零个或多个字符
**
匹配路径中的零个或多个目录
下面的示例演示了如何使用它:
要使用HTTP代理连接到远程主机,您可以通过以下方式配置路由:
<bean id="proxy" class="com.jcraft.jsch.ProxyHTTP">
<constructor-arg value="localhost"/>
<constructor-arg value="7777"/>
bean>
<route>
<from uri="sftp://localhost:9999/root?username=admin&password=admin&proxy=#proxy"/>
<to uri="bean:processFile"/>
route>
如果需要,您还可以为代理分配用户名和密码。请查阅文档com.jcraft.jsch.Proxy
以发现所有选项。
如果要明确指定sftp
组件应使用的身份验证方法列表,请使用preferredAuthentications
option。例如,如果您希望骆驼尝试使用私有/公共SSH密钥进行身份验证并在没有公共密钥可用的情况下回退到用户/密码身份验证,请使用以下路由配置:
from("sftp://localhost:9999/root?username=admin&password=admin&preferredAuthentications=publickey,password").
to("bean:processFile");
当您要下载单个文件并知道文件名时,可以使用fileName=myFileName.txt
告诉Camel要下载的文件名。默认情况下,使用者仍将执行FTP LIST命令以列出目录,然后根据该fileName
选项过滤这些文件。尽管在这种用例中,可能需要通过设置关闭目录列表useList=false
。例如,用于登录FTP服务器的用户帐户可能没有执行FTP LIST命令的权限。因此,您可以使用关闭它useList=false
,然后使用提供下载文件的固定名称fileName=myFileName.txt
,然后FTP使用者仍然可以下载文件。如果由于某种原因该文件不存在,则默认情况下Camel将引发异常,您可以将其关闭并通过设置忽略它ignoreFileNotFoundOrPermissionError=true
。
例如,让骆驼路线拾取单个文件,并在使用后将其删除,您可以
from("ftp://admin@localhost:21/nolist/?password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName=report.txt&delete=true")
.to("activemq:queue:report");
注意,我们已经使用了上面讨论的所有选项。
您也可以将其与结合使用ConsumerTemplate
。例如,下载一个文件(如果存在)并以String类型获取文件内容:
String data = template.retrieveBodyNoWait("ftp://admin@localhost:21/nolist/?password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName=report.txt&delete=true", String.class);