No se puede eliminar la carga útil después de empujar al servidor remoto mediante ExpressionEvaluatingRequestHandlerAdvice

Mhel:

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 Transformerclase:


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

Arteta:

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 Stringni 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 Stringobjeto? Creo que quiere borrar un archivo, por lo que es necesario tener exactamente Fileel objeto de que el consejo funcione correctamente.

Los FileReadingMessageSourcepuebla para nosotros un FileHeaders.ORIGINAL_FILEencabezado. Por lo tanto, puede cambiar su expresión para la eliminación en esto:

headers[file_originalFile].delete()

Y usted debe estar bien.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=340377&siteId=1
Recomendado
Clasificación