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

标签 java sftp spring-integration

我正在尝试在本地文件夹中生成一个文件,然后通过 SFTP 将其发送到远程服务器,最后删除创建的“临时”文件。几乎一切正常。

问题: 当我尝试使用 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 方法何时返回吗?

此外,如果您知道我如何删除该文件的其他方法,那就太好了。

最佳答案

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

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

关于java - MessageChannel.send 方法什么时候返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22371762/

相关文章:

java - Spring amqp——异步请求/响应场景下的消息关联

spring-integration - 使用 Spring Integration 和 AMQP,我可以创建竞争消费者的 Pub-Sub 组吗?

java - 如何在java dsl中设置消息驱动的入站适配器的恢复间隔?

java - 如何为同一个@Constraint 实现多个JSR-303 验证消息?

authentication - Curl 无法通过 sftp 密码身份验证

java - 如何在不解压缩的情况下通过 SFTP (Jsch) 编写压缩字节数组?

c# - SftpClient.UploadFile 和 SftpClient.WriteAllBytes 有什么区别?

java - 了解计算幂集时的递归流程

java - Waffle JAAS 认证

抛出 ConnectException 之前的 Java 延迟