Я пытаюсь создать файл в локальной папке, а затем отправить его через 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 или после его отправки. Знаете ли вы, когда возвращается метод send
?
Кроме того, если вы знаете другие способы, как я могу удалить этот файл, это было бы здорово.
Согласно его Javadoc, он возвращает true, если сообщение было успешно отправлено, что означает, что он не может вернуться до завершения отправки в случае успеха. Он может сразу же вернуться в случае сбоя.
Конечно, он должен исключать исключение в случае сбоя, а не просто возвращать false. Плохой дизайн.