MessageChannel.send方法什么时候返回?

时间:2014-03-13 07:22:55

标签: java sftp spring-integration

我尝试在本地文件夹中生成文件,然后通过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方法何时返回?

另外,如果你知道我可以删除该文件的其他方法,那就太棒了。

1 个答案:

答案 0 :(得分:1)

根据其Javadoc,如果消息已成功发送,则返回true,这意味着在成功的情况下,它不能返回发送完成。当然,它可以在失败的情况下立即返回。

当然应该在失败的情况下抛出异常,而不仅仅是返回false。设计不佳。