Mule FTP轮询停止,没有错误或警告

时间:2015-10-20 07:50:24

标签: java ftp mule polling mule-component

我遇到了Mule ESB独立的FTP轮询问题: 应用程序运行了几天没有问题,然后FTP轮询停止而没有发出警告或错误。

日志显示FTP轮询活动的迹象,直到它停止。之后什么也没有,但其他连接器仍处于活动状态(主要是SFTP轮询)。我启用了DEBUG登录运行时以查看是否还有活动,并且相应的连接器线程完全静默,就像停止或阻止一样。

最后,重新启动应用程序暂时解决了问题,但我试图理解为什么会发生这种情况以避免再次面对它。我怀疑FTP连接器线程是停止还是被阻止,阻止了进一步的民意调查。

它可能是由我们用来防止轮询后删除文件的扩展FtpMessageReceiver引起的(覆盖postProcess()函数)。不过看看这个组件和基本FTP接收器和连接器的源代码,我看不出它会如何发生。

任何想法为什么投票会突然停止而不会抛出错误?

以下是当前的连接器配置:

    <ftp:connector name="nonDeletingFtpConnector" doc:name="FTP"
        pollingFrequency="${frequency}"
        validateConnections="true">
    <reconnect frequency="${frequency}" count="${count}"/>
    <service-overrides messageReceiver="my.comp.NonDeletingFtpMessageReceiver" />
</ftp:connector>

以及相应的终点:

    <ftp:inbound-endpoint host="${ftp.source.host}" 
            port="${ftp.source.port}" 
            path="${ftp.source.path}" 
            user="${ftp.source.login}" 
            responseTimeout="10000"
            password="${ftp.source.password}" 
            connector-ref="archivingFtpConnector" 
            pollingFrequency="${ftp.default.polling.frequency}">
        <file:filename-wildcard-filter pattern="*.zip"/>
    </ftp:inbound-endpoint>

messageReceiver代码:

public class NonDeletingFtpMessageReceiver extends FtpMessageReceiver {
    public NonDeletingFtpMessageReceiver(Connector connector, FlowConstruct flowConstruct, InboundEndpoint endpoint, long frequency) throws CreateException {
        super(connector, flowConstruct, endpoint, frequency);
    }

    @Override
    protected void postProcess(FTPClient client, FTPFile file, MuleMessage message) throws Exception {
        //do nothing
    }
}

正如您所看到的,我们定义了一个FtpMessageReceiver以避免轮询时删除文件(这在流程中进一步完成),但查看代码我无法看到如何跳过super.postProcess()调用(负责删除文件的人可能会引起问题。

我查看了

FtpMessageReceiver源代码: https://github.com/mulesoft/mule/blob/mule-3.5.0/transports/ftp/src/main/java/org/mule/transport/ftp/FtpMessageReceiver.java

技术配置:

  • Mule Standalone 3.5.0
  • Ubuntu 14.04.2 LTS
  • Java OpenJDK运行时环境(IcedTea 2.5.6)(7u79-2.5.6-0ubuntu1.14.04.1)

任何帮助将不胜感激。谢谢提前!

1 个答案:

答案 0 :(得分:0)

正如评论中所讨论的,错误更多地与Apache FTP客户端相关联,我创建了一个特定的帖子here

以下是找到的解决方案:使用自定义FtpConnectionFactory以超时值&gt;正确配置客户端这样就会因抛出超时异常而中断挂起。

public class SafeFtpConnectionFactory extends FtpConnectionFactory{

        //define a default timeout
        public static int defaultTimeout = 60000;
        public static synchronized int getDefaultTimeout() {
            return defaultTimeout;
        }
        public static synchronized void setDefaultTimeout(int defaultTimeout) {
            SafeFtpConnectionFactory.defaultTimeout = defaultTimeout;
        }

        public SafeFtpConnectionFactory(EndpointURI uri) {
            super(uri);
        }

        @Override
        protected FTPClient createFtpClient() {
            FTPClient client = super.createFtpClient();

            //Define the default timeout here, which will be used by the socket by default,
            //instead of the 0 timeout hanging indefinitely
            client.setDefaultTimeout(getDefaultTimeout());

            return client;
        }
    }

然后将其附加到连接器:

<ftp:connector name="archivingFtpConnector" doc:name="FTP"
        pollingFrequency="${frequency}"
        validateConnections="true"
        connectionFactoryClass="my.comp.SafeFtpConnectionFactory">
    <reconnect frequency="${reconnection.frequency}" count="${reconnection.attempt}"/>
</ftp:connector>

如果另一方有任何显着的变化,我会尝试更新此答案。