使用ExpressionEvaluatingRequestHandlerAdvice将负载推送到远程服务器后,无法删除负



我正试图删除已使用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类:


@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;
}

再来一次:

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()

你应该没事的。

最新更新