简体   繁体   English

Apache FTPClient(和 Spring 中的 DefaultFtpSessionFactory)的不同超时属性的含义是什么?

[英]What is the meaning of different timeout properties of Apache FTPClient (and DefaultFtpSessionFactory in Spring)?

There are following timeout properties used for FTP communication:有以下用于 FTP 通信的超时属性:

  • connectTimeout : connection timeout in milliseconds, which will be passed to the Socket object's connect() method connectTimeout :以毫秒为单位的连接超时,它将传递给 Socket 对象的 connect() 方法
  • defaultTimeout : default timeout in milliseconds to use when opening a socket defaultTimeout :打开套接字时使用的默认超时(以毫秒为单位)
  • dataTimeout : timeout in milliseconds to use when reading from the data connection dataTimeout :从数据连接读取时使用的超时时间(以毫秒为单位)

Could you explain to Java/Kotlin developer why to set them and what bad things could happen if you do not set them?您能否向 Java/Kotlin 开发人员解释为什么要设置它们以及如果不设置它们会发生什么不好的事情?

To add some context: My server app needs to connect to FTP and list/upload/download/delete files.添加一些上下文:我的服务器应用程序需要连接到 FTP 并列出/上传/下载/删除文件。 I would like to be sure my attempts to connect or transfer file won't hang forever in case something goes wrong.我想确保我连接或传输文件的尝试不会永远挂起,以防出现问题。

All those properties from the AbstractFtpSessionFactory are propagated down to an FTPClient : AbstractFtpSessionFactory中的所有这些属性都向下传播到FTPClient

    if (this.connectTimeout != null) {
        client.setConnectTimeout(this.connectTimeout);
    }
    if (this.defaultTimeout != null) {
        client.setDefaultTimeout(this.defaultTimeout);
    }
    if (this.dataTimeout != null) {
        client.setDataTimeout(this.dataTimeout);
    }

The connectTimeout over there has a default value as private static final int DEFAULT_CONNECT_TIMEOUT = 60000;那边的connectTimeout有一个默认值private static final int DEFAULT_CONNECT_TIMEOUT = 60000; . . So, it is OK to miss it.所以,错过它是可以的。 Yes, this one is used when we create a Socket via connect() : _socket_.connect(new .netSocketAddress(host, port), connectTimeout);是的,当我们通过connect()创建Socket时会用到这个: _socket_.connect(new .netSocketAddress(host, port), connectTimeout);

The defaultTimeout is propagated down to _socket_.setSoTimeout(_timeout_); defaultTimeout向下传播到_socket_.setSoTimeout(_timeout_); which has an effect on socket read operations.这对套接字读取操作有影响。 See Socket.setSoTimeout() JavaDocs.请参阅Socket.setSoTimeout() JavaDocs。 Yes, its default value is 0 .是的,它的默认值为0 So, also OK to miss its configuration.所以,也可以错过它的配置。

The dataTimeout is used for the server Socket created in a ACTIVE_LOCAL_DATA_CONNECTION_MODE for similar setSoTimeout() option. dataTimeout用于在ACTIVE_LOCAL_DATA_CONNECTION_MODE中创建的服务器Socket ,用于类似的setSoTimeout()选项。 Default is the same: 0 - infinite wait for read operation answer.默认值相同:0 - 无限等待读取操作应答。

I derived all of that from Apache Commons Net source code.我从 Apache Commons Net 源代码中得出所有这些。

Doesn't look like the project provides some docs on the matter by itself: https://commons.apache.org/proper/commons.net/看起来该项目本身并不提供有关此事的一些文档: https://commons.apache.org/proper/commons.net/

So, yeah, a rule of thumb: always configure those props with a reasonable values.所以,是的,一条经验法则:始终使用合理的值配置这些道具。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM