簡體   English   中英

Spring Integration FTP使用后刪除本地文件(Spring Boot)

[英]Spring Integration FTP remove local files after use (Spring Boot)

我正在嘗試編寫一個程序,可以通過ftp從一台服務器獲取文件,並通過ftp將其放在另一台服務器上。 但是,我在寫入后刪除本地文件時遇到問題。 能夠在本地保存它不是問題,只要它是暫時的。 我已經嘗試將ExpressionEvaluatingRequestHandlerAdvice與OnSuccessExpression一起使用,我無法讓它實際使用該表達式。 代碼在這里:

@Configuration
@EnableConfigurationProperties(FTPConnectionProperties.class)
public class FTPConfiguration {

    private FTPConnectionProperties ftpConnectionProperties;

    public FTPConfiguration(FTPConnectionProperties ftpConnectionProperties) {
        this.ftpConnectionProperties = ftpConnectionProperties;
    }

    @Bean
    public SessionFactory<FTPFile> ftpInputSessionFactory() {
        DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
        sf.setHost(ftpConnectionProperties.getInputServer());
        sf.setUsername(ftpConnectionProperties.getInputFtpUser());
        sf.setPassword(ftpConnectionProperties.getInputFtpPassword());
        return new CachingSessionFactory<>(sf);
    }

    @Bean
    public SessionFactory<FTPFile> ftpOutputSessionFactory() {
        DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
        sf.setHost(ftpConnectionProperties.getOutputServer());
        sf.setUsername(ftpConnectionProperties.getOutputFtpUser());
        sf.setPassword(ftpConnectionProperties.getOutputFtpPassword());
        return new CachingSessionFactory<>(sf);
    }

    @Bean
    public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
        FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpInputSessionFactory());
        fileSynchronizer.setDeleteRemoteFiles(true);
        fileSynchronizer.setRemoteDirectory(ftpConnectionProperties.getInputDirectory());
        fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.TIF"));
        return fileSynchronizer;
    }

    @Bean
    @InboundChannelAdapter(channel = "input", poller = @Poller(fixedDelay = "5000"))
    public MessageSource<File> ftpMessageSource() {
        FtpInboundFileSynchronizingMessageSource source = new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer());
        source.setLocalDirectory(new File("ftp-inbound"));
        source.setAutoCreateLocalDirectory(true);
        source.setLocalFilter(new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), ""));
        return source;
    }

    @Bean
    @ServiceActivator(inputChannel = "input")
    public MessageHandler handler() {
        FtpMessageHandler handler = new FtpMessageHandler(ftpOutputSessionFactory());
        handler.setRemoteDirectoryExpression(new LiteralExpression(ftpConnectionProperties.getOutputDirectory()));
        handler.setFileNameGenerator(message -> {
            if (message.getPayload() instanceof File) {
                return ((File) message.getPayload()).getName();
            } else {
                throw new IllegalArgumentException("File expected as payload.");
            }
        });
        return handler;
    }

}

它完全按預期處理遠程文件,從源中刪除遠程文件並放入輸出,但在使用后不刪除本地文件。

我建議你將該input通道作為PublishSubscribeChannel並添加一個更簡單的訂閱者:

@Bean
public PublishSubscribeChannel input() {
    return new PublishSubscribeChannel();
}


@Bean
@ServiceActivator(inputChannel = "input")
public MessageHandler handler() {
    ...
}


@Bean
@ServiceActivator(inputChannel = "input")
public MessageHandler deleteLocalFileService() {
    return m ->  ((File) message.getPayload()).delete();
}

這樣,帶有File有效負載的相同消息將首先發送到您的FtpMessageHandler然后才會發送到這個新的deleteLocalFileService以便根據有效負載刪除本地文件。

簡單的解決方案從SFTP服務器獲取文件,然后將該文件移動到具有不同名稱的其他文件夾。

   @Bean
        public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
            DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);

            if (sftpServerProperties.getSftpPrivateKey() != null) {

                factory.setPrivateKey(sftpServerProperties.getSftpPrivateKey());
                factory.setPrivateKeyPassphrase(sftpServerProperties.getSftpPrivateKeyPassphrase());
            } else {
                factory.setPassword(sftpServerProperties.getPassword());

            }
            factory.setHost(sftpServerProperties.getSftpHost());
            factory.setPort(sftpServerProperties.getSftpPort());
            factory.setUser(sftpServerProperties.getSftpUser());

            factory.setAllowUnknownKeys(true);

            return new CachingSessionFactory<>(factory);
        }

        @Bean
        public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
            SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
            fileSynchronizer.setDeleteRemoteFiles(false);
            fileSynchronizer.setRemoteDirectory(sftpServerProperties.getSftpRemoteDirectoryDownload());
            fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter(sftpServerProperties.getSftpRemoteDirectoryDownloadFilter()));
            return fileSynchronizer;
        }

        @Bean
        @InboundChannelAdapter(channel = "fromSftpChannel", poller = @Poller(cron = "*/10 * * * * *"))
        public MessageSource<File> sftpMessageSource() {
            SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
                    sftpInboundFileSynchronizer());
            source.setLocalDirectory(util.createDirectory(Constants.FILES_DIRECTORY));
            source.setAutoCreateLocalDirectory(true);
            return source;
        }

        @Bean
        @ServiceActivator(inputChannel = "fromSftpChannel")
        public MessageHandler resultFileHandler() {
            return (Message<?> message) -> {
                String csvFilePath = util.getDirectory(Constants.FILES_DIRECTORY) + Constants.INSIDE + message.getHeaders().get("file_name");
                util.readCSVFile(csvFilePath, String.valueOf(message.getHeaders().get("file_name")));
                File file = (File) message.getPayload();
                File newFile = new File(file.getPath() + System.currentTimeMillis());

                try {
                    FileUtils.copyFile(file, newFile);
                    sftpGateway.sendToSftp(newFile);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (file.exists()) {
                    file.delete();
                }
                if (newFile.exists()) {
                    newFile.delete();
                }

            };
        }

        @Bean
        @ServiceActivator(inputChannel = "toSftpChannelDest")
        public MessageHandler handlerOrderBackUp() {
            SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
            handler.setAutoCreateDirectory(true);
            handler.setRemoteDirectoryExpression(new LiteralExpression(sftpServerProperties.getSftpRemoteBackupDirectory()));
            return handler;
        }


        @MessagingGateway
        public interface SFTPGateway {
            @Gateway(requestChannel = "toSftpChannelDest")
            void sendToSftp(File file);


        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM