Невозможно удалить полезную нагрузку после ее отправки на удаленный сервер с помощью ExpressionEvaluatingRequestHandlerAdvice - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь удалить исходный файл, который был передан на удаленный сервер с помощью ExpressionEvaluatingRequestHandlerAdvice:

    @Bean
    public Advice expressionAdvice(GenericEndpointSpec<FileTransferringMessageHandler<ChannelSftp.LsEntry>> c) {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setOnSuccessExpressionString("payload.delete()");
        advice.setOnFailureExpressionString("payload + ' failed to upload'");
        advice.setTrapException(true);
        return advice;
    }

в приведенном ниже коде:

    @Bean
    public IntegrationFlow integrationFlow() {
        return IntegrationFlows.from(fileReader(), spec -> spec.poller(Pollers.fixedDelay(1000)))
                .transform(transformer, "transform")
                .handle(
                        Sftp.outboundAdapter(sftpSessionFactory, FileExistsMode.REPLACE)
                        .remoteDirectory(sftpRemoteDirectory), 
                        c -> c.advice(expressionAdvice(c))
                )
                .get();
    }

    @Bean
    public FileReadingMessageSource fileReader() {
        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setDirectory(new File(localSourceDirectory));
        return source;
    }

И мой Transformer class:


@Component
public class Transformer {

    public String transform(String filePath) throws IOException {
        String content = new String(Files.readAllBytes(Paths.get(filePath)));
        return "Transformed content: " + content;
    }

}

Однако, когда я проверяю исходный каталог, файл все еще там. Что мне здесь не хватает? Помогите пожалуйста.

Я использую Spring Integration 5.2.4.

Заранее спасибо!


Вот рабочий код, основанный на ответе @ ArtemBilan:


    @Bean
    public Advice expressionAdvice(GenericEndpointSpec<FileTransferringMessageHandler<ChannelSftp.LsEntry>> c) {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        // advice.setOnSuccessExpressionString("payload.delete()");
        advice.setOnSuccessExpressionString("headers[file_originalFile].delete()");
        advice.setOnFailureExpressionString("payload + ' failed to upload'");
        advice.setTrapException(true);
        return advice;
    }

1 Ответ

1 голос
/ 21 марта 2020

Еще раз:

public String transform(String filePath) throws IOException {
    String content = new String(Files.readAllBytes(Paths.get(filePath)));
    return "Transformed content: " + content;
}

Итак, ваш .transform(transformer, "transform") производит String, а не File. Это нормально для Sftp.outboundAdapter(), потому что он может преобразовать эту строку в содержимое удаленного файла. Но что advice.setOnSuccessExpressionString("payload.delete()"); должен сделать для объекта String? Я полагаю, что вы хотите удалить файл, поэтому вам нужно иметь ровно File объект, чтобы этот совет работал правильно.

FileReadingMessageSource заполняет для нас заголовок FileHeaders.ORIGINAL_FILE. Таким образом, вы можете изменить свое выражение для удаления на это:

headers[file_originalFile].delete()

И с вами все будет в порядке.

...