我尝试在本地文件夹中生成文件,然后通过SFTP将其发送到远程服务器,最后删除“临时”文件夹。文件已创建。几乎所有工作都很好。
ISSUE: 当我尝试使用File.delete(或Files.delete)删除文件时,它不会这样做。原因:文件由另一个进程使用。请注意,没有其他进程(通过sftp发送的进程除外)正在使用该文件。
处理以下文件的代码:
List<Order> orders = orderRepository.findAll();
try (FileWriter fileWriter = new FileWriter(tempFile)) {
contentCreator.generateContent(orders, fileWriter);
LOGGER.debug("Handover file written successfully " + tempFile.getAbsolutePath());
} catch (IOException e) {
throw new IllegalStateException("Cannot write in the temp folder. Handover failed.", e);
}
final Message<File> message = MessageBuilder.withPayload(tempFile).build();
if (sftpChannel.send(message)) { //sftpChannel comes autowired by Spring IoC
doLogicInCaseOfSuccess(); //I set some DB records after the file was sent successfully over sftp.
tempFile.delete(0);
}
这是配置:
<bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<property name="host" value="${host}"/>
<property name="port" value="${port}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<int:channel id="apstChannel"/>
<int-sftp:outbound-channel-adapter id="sftpOutboundAdapter"
session-factory="sftpSessionFactory"
channel="apstChannel"
charset="UTF-8"
remote-directory="${dropFolder}"
/>
我不明白文件是如何使用的,即使MessageChannel.send
方法返回true(因此传输成功)?
由于我找不到任何文档,我现在不相信当文件排队等待通过sftp发送时,或者实际发送后,该方法将返回true。你知道send
方法何时返回?
另外,如果你知道我可以删除该文件的其他方法,那就太棒了。
答案 0 :(得分:1)
根据其Javadoc,如果消息已成功发送,则返回true,这意味着在成功的情况下,它不能返回发送完成。当然,它可以在失败的情况下立即返回。
当然应该在失败的情况下抛出异常,而不仅仅是返回false。设计不佳。