Spring集成 - 对外转移重命名问题(Spring Integration - outbound

2019-10-20 13:54发布

我使用的示例程序在这里建立我的代码。 一切工作正常与本地SFTP测试服务器,当我在我的客户SFTP服务器今天测试的,它给了我下面的例外。

当我调试,我看到正在写入的文件与客户的SFTP服务器上“.writing”延伸。 内容都很好,我看不出与转移,但文件名是现在的问题文件的任何问题。 通过阅读后春天的文档 ,我看,这是暂时的文件扩展名,程序试图将其重命名回原来的名字,但由于客户端SFTP不提供这个选项,它会抛出和异常。

我试着写的temporary-file-suffix=".writing"作为temporary-file-suffix=""以为会设置的选项了,唉同样的问题。 有没有解决办法?

其中的帖子提到这一点,但没有解决方案或问题消失了用户。

> 2014-07-28 20:11:21,564 [main] INFO  com.jcraft.jsch - SSH_MSG_NEWKEYS
> sent 2014-07-28 20:11:21,608 [main] INFO  com.jcraft.jsch -
> SSH_MSG_NEWKEYS received 2014-07-28 20:11:21,678 [main] INFO 
> com.jcraft.jsch - SSH_MSG_SERVICE_REQUEST sent 2014-07-28 20:11:21,770
> [main] INFO  com.jcraft.jsch - SSH_MSG_SERVICE_ACCEPT received
> 2014-07-28 20:11:21,818 [main] INFO  com.jcraft.jsch - Authentications
> that can continue: publickey,keyboard-interactive,password 2014-07-28
> 20:11:21,818 [main] INFO  com.jcraft.jsch - Next authentication
> method: publickey 2014-07-28 20:11:21,819 [main] INFO  com.jcraft.jsch
> - Authentications that can continue: keyboard-interactive,password 2014-07-28 20:11:21,819 [main] INFO  com.jcraft.jsch - Next
> authentication method: keyboard-interactive 2014-07-28 20:11:21,978
> [main] INFO  com.jcraft.jsch - Authentication succeeded
> (keyboard-interactive). 2014-07-28 20:11:22,199 [main] DEBUG
> org.springframework.beans.factory.support.DefaultListableBeanFactory -
> Returning cached instance of singleton bean
> 'integrationEvaluationContext' 2014-07-28 20:11:22,878 [main] DEBUG
> org.springframework.integration.sftp.session.SftpSession - Initial
> File rename failed, possibly because file already exists. Will attempt
> to delete file: remote/TESTFILE.ABC and execute rename again.
> 2014-07-28 20:11:22,958 [main] INFO  com.jcraft.jsch - Disconnecting
> from fsgatewaytest.aexp.com port 22 2014-07-28 20:11:22,961 [Connect
> thread fsgatewaytest.aexp.com session] INFO  com.jcraft.jsch - Caught
> an exception, leaving main loop due to Socket closed Exception in
> thread "main" org.springframework.messaging.MessageDeliveryException:
> Error handling message for file [data/TESTFILE.ABC -> TESTFILE.ABC]
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate$1.doInSession(RemoteFileTemplate.java:227)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate$1.doInSession(RemoteFileTemplate.java:190)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:302)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:190)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:182)
>   at
> org.springframework.integration.file.remote.handler.FileTransferringMessageHandler.handleMessageInternal(FileTransferringMessageHandler.java:101)
>   at
> org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
>   at
> org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
>   at
> org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)
>   at
> org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)
>   at
> org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
>   at
> org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:255)
>   at
> org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:223)
>   at
> com.reachlocal.payment.integration.SftpOutboundTransferMain.main(SftpOutboundTransferMain.java:43)
> Caused by: org.springframework.messaging.MessagingException: Failed to
> write to 'inbox/REACHLOCALTST.CUFI.writing' while uploading the file
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:397)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate.access$500(RemoteFileTemplate.java:56)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate$1.doInSession(RemoteFileTemplate.java:213)
>   ... 13 more Caused by: org.springframework.core.NestedIOException:
> Failed to delete file inbox/TESTFILE.ABC; nested exception is
> org.springframework.core.NestedIOException: Failed to remove file: 2:
> Specified file path is invalid.   at
> org.springframework.integration.sftp.session.SftpSession.rename(SftpSession.java:200)
>   at
> org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:393)
>   ... 15 more Caused by: org.springframework.core.NestedIOException:
> Failed to remove file: 2: Specified file path is invalid.     at
> org.springframework.integration.sftp.session.SftpSession.remove(SftpSession.java:83)
>   at
> org.springframework.integration.sftp.session.SftpSession.rename(SftpSession.java:194)
> ... 16 more

更新了配置:采用用临时文件名=“假”解决了这个问题。 万分感谢。

<int:channel id="inputChannel"/>

<int-sftp:outbound-channel-adapter id="sftpOutboundAdapter"
            session-factory="sftpSessionFactory"
            channel="inputChannel"
            remote-filename-generator-expression="payload.getName()"
            remote-directory="inbox"
            use-temporary-file-name="false"/>

Answer 1:

这样如何use-temporary-file-name

在这种情况下你结束了这一点:

try {
    session.write(inputStream, tempFilePath);
    // then rename it to its final name if necessary
    if (useTemporaryFileName){
       session.rename(tempFilePath, remoteFilePath);
    }
}

从提到的文档:

然而,也有可能是,你不想使用这种技术(例如,如果服务器不允许重命名文件)的情况。 对于这样的情况,您可以禁用通过设置使用,临时文件名称为false(默认为true)此功能。 当此属性为false,该文件中写入它的最终名称和消费应用程序将需要一些其他的机制来检测该文件被访问之前完全上传。



文章来源: Spring Integration - outbound transfer renaming issues