Когда возвращается метод MessageChannel.send?

1

Я пытаюсь создать файл в локальной папке, а затем отправить его через 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?

Кроме того, если вы знаете другие способы, как я могу удалить этот файл, это было бы здорово.

Теги:
spring-integration
sftp

1 ответ

1

Согласно его Javadoc, он возвращает true, если сообщение было успешно отправлено, что означает, что он не может вернуться до завершения отправки в случае успеха. Он может сразу же вернуться в случае сбоя.

Конечно, он должен исключать исключение в случае сбоя, а не просто возвращать false. Плохой дизайн.

  • 0
    Да, исключение было бы лучше здесь. На самом деле он может выдать RuntimeException, если что-то пойдет не так, хотя более конкретный вариант был бы неплохим. Но до сих пор не ясно, что означает «отправлено». Это отправляется в очередь сообщений или отправляется на удаленный сервер (таким образом, когда сообщение было обработано)? В настоящее время я смотрю на это с помощью JSch напрямую, поскольку Spring Integration кажется слишком сложной для такой простой задачи, как эта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню