2015-10-20 63 views
3

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

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

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

它可能是由于我们用来防止poll(覆盖postProcess()函数)后文件删除的扩展FtpMessageReceiver引起的。然而,看看这个组件和基本的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

技术配置:

  • 骡子独立3.5.0
  • 的Ubuntu 14.04.2 LTS
  • 的Java OpenJDK的运行时环境(2.5的IcedTea。 6)(7u79-2.5.6-0ubuntu1.14.04.1)

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

+0

我们在我们的应用程序中几次遇到这个问题,在日志文件中没有错误,并且不知道发生了什么。最终导致应用程序重新启动。我更喜欢在线程阻塞或等待FTP连接时检查FTP服务器中是否存在任何问题。 – RamakrishnaN

+0

干得好,我检查了与netstat挂起的FTP连接,并且有几个连接打开了几天仍然打开。使用jstack我能够跟踪伪代码并用自定义FtpConnectionFactory编写解决方法; (我创建了另一个帖子,因为这与Apache Commons Net FTP Client更相关) –

+1

[link](https://stackoverflow.com/questions/33350649/commons-net-ftpclient-hangs-indefinitely-with-mule)to Pierre B.的另一篇文章。 – Anssssss

回答

0

正如评论中所述,该错误更多地与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> 

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