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

标签 java ftp mule polling mule-component

我在 Mule ESB 独立版的 FTP 轮询中遇到了问题: 该应用程序运行了几天,没有出现任何问题,然后 FTP 轮询停止,没有给出警告或错误。

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

最后,重新启动应用程序暂时解决了问题,但我试图理解为什么会发生这种情况,以避免再次遇到它。我怀疑 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>

消息接收者代码:

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 单机版 3.5.0
  • Ubuntu 14.04.2 LTS
  • Java OpenJDK 运行时环境 (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)

如有任何帮助,我们将不胜感激。提前致谢!

最佳答案

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

这里是找到的解决方案:使用自定义 FtpConnectionFactory 正确配置客户端,超时值 > 0。这样挂起就会中断,并抛出超时异常。

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>

如果其他答案有任何显着变化,我会尝试更新此答案。

关于java - Mule FTP 轮询停止,没有错误或警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33230947/

相关文章:

java - 使用递归回溯查找有向图中的所有循环

java - PDF框。 Java : How to print only one page of PDF instead of full document?

java - 尝试代码没有被执行?

java - Java 断言是否损坏?

java - 在将自定义对象返回到 mule 流时我做错了什么以及如何返回可由另一个 mule 流使用的对象?

python - 是否有一个统一的python库来使用不同的协议(protocol)传输文件

php - 从 PHP CURL 使用 FTP

java - 将pdf和tiff添加到同一个pdf文档中并在浏览器中显示

http - 骡子 - 找不到变量

java - Spring3 依赖注入(inject)不适用于 mule