在简单重命名时删除了MuleStudio文件

时间:2013-12-20 07:28:54

标签: mule mule-studio

在MuleStudio中,一段简单的重命名脚本会在一段时间后删除文件。这就是脚本的样子:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ftp="http://www.mulesoft.org/schema/mule/ftp" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.4.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ftp http://www.mulesoft.org/schema/mule/ftp/current/mule-ftp.xsd">
    <flow name="ftp_ping_pong_testFlow1" doc:name="ftp_ping_pong_testFlow1" initialState="started" processingStrategy="queued-asynchronous">
        <file:inbound-endpoint path="C:\ftp_ping_pong_test\src\test\in\" responseTimeout="10000" doc:name="File" fileAge="1000" pollingFrequency="1200">
            <file:filename-regex-filter pattern="^.*\.csv$" caseSensitive="true"/>
        </file:inbound-endpoint>
        <file:outbound-endpoint path="C:\ftp_ping_pong_test\src\test\in\" outputPattern="#[message.inboundProperties['originalFilename']].temp" responseTimeout="10000" doc:name="File"/>
    </flow>
    <flow name="ftp_ping_pong_testFlow2" doc:name="ftp_ping_pong_testFlow2">
        <file:inbound-endpoint path="C:\ftp_ping_pong_test\src\test\in\" responseTimeout="10000" doc:name="File" fileAge="1000" pollingFrequency="1200">
            <file:filename-regex-filter pattern="^.*\.temp$" caseSensitive="true"/>
        </file:inbound-endpoint>
        <file:outbound-endpoint path="C:\ftp_ping_pong_test\src\test\in\" outputPattern="#[message.inboundProperties['originalFilename'].replace('.temp','')]" responseTimeout="10000" doc:name="File"/>
    </flow>
</mule> 

除了重命名文件外,该脚本不会重命名文件。如果我提高fileAge或者我改变处理策略或者在MuleStudio或Mule Standalone中运行它没有区别。奇怪的是,它适用于约300次迭代,但后来却变得混乱。

我得到的错误日志如下:

WARN  2013-12-19 12:43:15,815 [Finalizer] org.mule.transport.file.FileMessageReceiver: Failure trying to remove file C:\ftp_ping_pong_test\src\test\in\145278.csv.temp from list of files under processing

我已经因为这个问题已经失去了一周,所以任何帮助都会非常感激:)

更新: 我创建了两个不同的应用。他们在这里:

<?xml version="1.0" encoding="UTF-8"?>

<mule Links removed by Stackoverflow">
    <file:connector name="File_Connector_CSV"    autoDelete="true" streaming="false" validateConnections="true" doc:name="File" readFromDirectory="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\in" writeToDirectory="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\out"/>
    <flow name="ftp_ping_pong_testFlow1" doc:name="ftp_ping_pong_testFlow1" initialState="started" processingStrategy="synchronous">
        <file:inbound-endpoint path="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\in\" responseTimeout="10000" doc:name="File" fileAge="1000" pollingFrequency="1200" connector-ref="File_Connector_CSV"  >
            <file:filename-regex-filter pattern="^.*\.csv$" caseSensitive="true"/>
        </file:inbound-endpoint>
        <file:outbound-endpoint  outputPattern="#[message.inboundProperties['originalFilename']].temp" responseTimeout="10000" doc:name="File" path="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\out"/>
    </flow>
</mule>

第二个:

<?xml version="1.0" encoding="UTF-8"?>

<mule links removed by Stackoverflow">
    <file:connector name="File" writeToDirectory="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\in" readFromDirectory="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\out" autoDelete="true" streaming="false" validateConnections="true" doc:name="File"/>
    <flow name="ftp_ping_pong_player2Flow1" doc:name="ftp_ping_pong_player2Flow1">
        <file:inbound-endpoint path="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\out" responseTimeout="10000" doc:name="File" connector-ref="File">
            <file:filename-regex-filter pattern="^.*\.temp$" caseSensitive="true"/>
        </file:inbound-endpoint>
        <file:outbound-endpoint path="C:\Users\gabor.bodo\MuleStudio\workspace\ftp_ping_pong_test\src\test\in\" outputPattern="#[message.inboundProperties['originalFilename'].replace('.temp','')]" responseTimeout="10000" doc:name="File" connector-ref="File"/>
    </flow>
</mule>

我用7个测试文件运行测试,并且像往常一样,文件开始消失。从组合日志中,这是其中一个文件的最后一次出现:

    INFO  2013-12-20 17:58:13,843 [[ping_pong_player1].File_Connector_CSV.receiver.01] org.mule.transport.file.FileMessageReceiver: Lock obtained on file: C:\ftp_ping_pong_test\src\test\in\09.csv
    INFO  2013-12-20 17:58:14,519 [[ping_pong_player1].File_Connector_CSV.receiver.01] org.mule.transport.file.FileConnector: Writing file to: C:\ftp_ping_pong_test\src\test\out\09.csv.temp
    INFO  2013-12-20 17:58:14,812 [[ping_pong_player2].File.receiver.01] org.mule.transport.file.FileMessageReceiver: Lock obtained on file: C:\ftp_ping_pong_test\src\test\out\09.csv.temp
    INFO  2013-12-20 17:58:15,437 [[ping_pong_player2].File.dispatcher.402] org.mule.transport.file.FileConnector: Writing file to: C:\ftp_ping_pong_test\src\test\in\09.csv

在这些日志条目之后,此文件消失了,日志中没有任何进一步的跟踪。 我观察到即使在MuleStudio中有一个为File Age定义的默认值,该值也没有在XML文件中表示,这就是Player2没有定义文件年龄的原因。

我可以讨论一种可能的情况: - Player1,读取csv文件并创建临时文件。播放器2读取临时值并写回csv。 Player1删除csv,认为它仍然是原始文件。在这种情况下,Player1太慢,让Player2介入,如果Player2没有File Age,就会发生这种情况。 - 我必须相应地使用文件年龄值设置重新测试它。但它没有解释为什么很少发生这种情况。

谢谢, 的Gabor

2 个答案:

答案 0 :(得分:0)

<强>更新 我知道你的感受。添加文件连接器后,取消选中常规标签中的自动删除

enter image description here

答案 1 :(得分:0)

最后,在无数次实验之后,我设法弄清楚问题是什么。

似乎当mule启动一个应用程序时,File Age属性将只检查一次,而不是单独检查每个流(可能是正常但我没想到这种行为)。即使有不同的流程,只要文件年龄属性小于Mule的标准启动时间(说5000毫秒,但实际上它是50000毫秒 - 有人在某处添加了一个零)并不重要。

所以发生了什么,Player1和Player2总是试图同时读取,复制和删除所有文件。这只是一个问题,直到我上面描述的场景发生时才发生。

解决方案现在运行良好,通过使用足够大的FileAge创建两个单独的应用程序(注意,在MuleStudio中定义了FileAge是不够的,它也必须在XML中!)。

希望为某人节省时间,并感谢所有的好意!