我正试图删除已使用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()
你应该没事的。