Estoy tratando de borrar el archivo de origen que ha sido empujado a un servidor remoto utilizando el 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;
}
en el siguiente código:
@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;
}
Y mi Transformer
clase:
@Component
public class Transformer {
public String transform(String filePath) throws IOException {
String content = new String(Files.readAllBytes(Paths.get(filePath)));
return "Transformed content: " + content;
}
}
Sin embargo, al comprobar el directorio de origen, el archivo sigue ahí. ¿Que me estoy perdiendo aqui? Ayuda por favor.
Estoy usando la primavera Integración 5.2.4.
¡Gracias por adelantado!
Aquí está el código de trabajo basado en la respuesta de @ 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;
}
Una vez más:
public String transform(String filePath) throws IOException {
String content = new String(Files.readAllBytes(Paths.get(filePath)));
return "Transformed content: " + content;
}
Por lo tanto, el .transform(transformer, "transform")
A produce String
ni una File
. Esto está bien para el Sftp.outboundAdapter()
, ya que es capaz de transformar esa cadena en un contenido de archivos remoto. Pero lo que es que advice.setOnSuccessExpressionString("payload.delete()");
debe hacer para el String
objeto? Creo que quiere borrar un archivo, por lo que es necesario tener exactamente File
el objeto de que el consejo funcione correctamente.
Los FileReadingMessageSource
puebla para nosotros un FileHeaders.ORIGINAL_FILE
encabezado. Por lo tanto, puede cambiar su expresión para la eliminación en esto:
headers[file_originalFile].delete()
Y usted debe estar bien.