int-ftp:inbound-channel-adapter应该在几分钟的工作后重启?

时间:2016-07-31 06:56:48

标签: java spring-integration

我在项目中使用Spring Integration,我的上下文中有一个int-ftp:inbound-channel-adapter,如下所示:

 <int-ftp:inbound-channel-adapter id="test-inbound-channel-adapter"
                                     channel="tmp-channel"
                                     session-factory="ftp-Session"
                                     auto-create-local-directory="true"
                                     delete-remote-files="true"
                                     auto-startup="${ftp.active}"
                                     filename-regex="my regex ...."
                                     remote-directory="${ftp.input.path}"
                                     remote-file-separator="/"
                                     local-filename-generator-expression="@fileNameGenerator.generateNameBy('test',#this)"
                                     temporary-file-suffix=".writing"
                                     local-directory="${backupRootPath}/test/tmp//">
        <int:poller fixed-rate="10000"/>
    </int-ftp:inbound-channel-adapter>

它工作正常,但在几分钟的工作后不能与ftp服务器一起工作,系统应该重启,错误日志如下:

2016-07-31 17:11:08.381 ERROR 2980 --- [sk-scheduler-10] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessagingException: Problem occurred while synchronizing remote to local directory; nested exception is org.springframework.messaging.MessagingException: Failure occurred while copying from remote to local directory; nested exception is java.net.SocketTimeoutException: Read timed out
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:266)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource.doReceive(AbstractInboundFileSynchronizingMessageSource.java:193)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource.doReceive(AbstractInboundFileSynchronizingMessageSource.java:59)
    at org.springframework.integration.endpoint.AbstractMessageSource.receive(AbstractMessageSource.java:134)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:175)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:224)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:57)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:176)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:173)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:330)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:324)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.messaging.MessagingException: Failure occurred while copying from remote to local directory; nested exception is java.net.SocketTimeoutException: Read timed out
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.copyFileToLocalDirectory(AbstractInboundFileSynchronizer.java:295)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer$1.doInSession(AbstractInboundFileSynchronizer.java:234)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer$1.doInSession(AbstractInboundFileSynchronizer.java:223)
    at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:410)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:223)
    ... 22 more
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.read(BufferedReader.java:182)
    at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:314)
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:483)
    at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:821)
    at org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:1854)
    at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1845)
    at org.springframework.integration.ftp.session.FtpSession.read(FtpSession.java:81)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.copyFileToLocalDirectory(AbstractInboundFileSynchronizer.java:288)
    ... 26 more

如何解决?

提前致谢

1 个答案:

答案 0 :(得分:1)

尝试自定义DefaultFtpSessionFactory。例如客户端模式:

/**
 * ACTIVE_LOCAL_DATA_CONNECTION_MODE = 0 <br>
 * A constant indicating the FTP session is expecting all transfers
 * to occur between the client (local) and server and that the server
 * should connect to the client's data port to initiate a data transfer.
 * This is the default data connection mode when and FTPClient instance
 * is created.
 * PASSIVE_LOCAL_DATA_CONNECTION_MODE = 2 <br>
 * A constant indicating the FTP session is expecting all transfers
 * to occur between the client (local) and server and that the server
 * is in passive mode, requiring the client to connect to the
 * server's data port to initiate a transfer.
 *
 * @param clientMode The client mode.
 */
public void setClientMode(int clientMode) {

还有其他关于超时的选项:

/**
 * Set the connect timeout for the socket.
 * @param connectTimeout the timeout
 */
public void setConnectTimeout(int connectTimeout) {
     this.connectTimeout = connectTimeout;
}

/**
 * Set the (socket option) timeout on the command socket.
 * @param defaultTimeout the timeout.
 */
public void setDefaultTimeout(int defaultTimeout) {
    this.defaultTimeout = defaultTimeout;
}

/**
 * Set the (socket option) timeout on the data connection.
 * @param dataTimeout the timeout.
 */
public void setDataTimeout(int dataTimeout) {
    this.dataTimeout = dataTimeout;
}

当然,咨询您的FTP服务器以确定它不喜欢您的连接并删除它们会更好。