使用Mule 3.2.1,我们遇到了一个奇怪的问题,我们使用SFTP组件从服务器获取pgp加密的报告文件。我们使用SFTP组件归档文件,然后使用file:endpoint生成工作副本以供进一步处理。
我们的问题是,每隔一段时间,文件的工作副本最终会损坏,但SFTP存档文件很好。在十六进制编辑器中查看损坏的文件时,我们看到了良好的字节,然后突然间,我们看到文件其余部分的空字节。当Mule正在复制时,看起来基础文件被删除了。
另一个令人困惑的信息是我们已经尝试再次下载失败的文件,并且一切正常。这让我相信它不是文件中存在的问题,但显然我们确实有一个文件似乎始终失败。所有这些都发生在生产服务器上,文件是我无法访问的。
在不知道骡子的内部运作的情况下,我不知道什么条件会造成这个问题。
有没有聪明的人熟悉骡子的内部运作来冒险猜测?
此外,我们不是Mule专家,欢迎对我们的Mule配置进行任何批评。 (顺便说一句,下面的配置是生产中的修改版本,并且更频繁地进行民意调查等)
<sftp:connector name="SftpConnector" validateConnections="true" autoDelete="true">
<file:expression-filename-parser />
</sftp:connector>
<file:connector name="FileConnector" pollingFrequency="1000" fileAge="1000" streaming="false"
autoDelete="false">
<service-overrides messageFactory="org.mule.transport.file.FileMuleMessageFactory" />
<file:expression-filename-parser />
</file:connector>
<sftp:endpoint name="SftpEndpoint" connector-ref="SftpConnector" host="localhost"
port="22" user="tdr" password="password" path="/opt/tdr/outbound" archiveDir="/home/cps/mule/sftp-archive"
responseTimeout="30000" sizeCheckWaitTime="2500" disableTransportTransformer="true">
<file:filename-wildcard-filter pattern="*.pgp,*.gpg" />
</sftp:endpoint>
<file:endpoint name="FileEndpoint" connector-ref="FileConnector" path="/home/cps/mule/input" />
<flow name="DfrFileGrabber">
<quartz:inbound-endpoint jobName="ptDfrGrabber" cronExpression="0/2 * * * * ?">
<quartz:endpoint-polling-job>
<quartz:job-endpoint ref="SftpEndpoint" />
</quartz:endpoint-polling-job>
</quartz:inbound-endpoint>
<file:outbound-endpoint ref="FileEndpoint" outputPattern="#[header:originalFilename]" />
</flow>
答案 0 :(得分:1)
我认为我们已经触底了。我不能保证我的测试用例重复了我们在生产中看到的问题,但我认为问题的根源是如果要复制的文件足够大,石英计时器可能会在之前的时间点亮sftp副本已完成,导致使用相同的文件名进行多个副本。
一种解决方案是在SFTP连接上包含tempDir属性。这导致SFTP连接将正在检索的文件移动到服务器上的tempDir目录中,同时进行复制。因此,如果石英计时器在第一个副本完成之前触发,则它找不到相同的文件。