Rumah  >  Artikel  >  Intergation SFTP Spring: Mengendalikan memindahkan fail ke direktori lain

Intergation SFTP Spring: Mengendalikan memindahkan fail ke direktori lain

WBOY
WBOYke hadapan
2024-02-09 14:18:09515semak imbas

Editor php memperkenalkan Integrasi Spring SFTP sebagai rangka kerja berkuasa yang boleh membantu pembangun mengendalikan tugas mengalihkan fail dari satu direktori ke direktori lain. Sama ada pada pelayan tempatan atau pelayan jauh, rangka kerja ini memudahkan untuk mengalih dan mengurus fail. Ia menyediakan satu siri API dan pilihan konfigurasi yang membolehkan pembangun menyesuaikan logik memindahkan fail dan mengendalikan pelbagai pengecualian. Sama ada dalam aplikasi peringkat perusahaan atau projek peribadi, Spring SFTP Integration ialah alat yang sangat praktikal yang patut diterokai.

Kandungan soalan

Saya baru dalam intergation musim bunga. Saya perlu memproses fail dari pelayan sftp dari direktori user1/muat naik dan kemudian memindahkannya ke direktori user1/diproses. Kod saya biasanya berfungsi dengan baik, tetapi saya mempunyai dua masalah:

  1. Apabila saya memulakan semula aplikasi, direktori pengguna1/diproses dan semua fail yang wujud sebelum ini dipadamkan. Saya hanya mahu menulis lebih banyak fail di sana tanpa mengosongkan direktori setiap kali.

  2. Setiap kali saya memulakan aplikasi, saya menerima fail (seperti yang saya lihat nama mereka dan saya mencetak ke konsol) saya menerima fail lama yang telah dialihkan ke direktori yang diproses. Ini kelihatan sangat pelik kerana saya tidak melihat fail ini apabila saya menyambung ke sftp melalui alat lain seperti winscp. Adakah senarai fail lama telah diberi penghormatan di suatu tempat?

@Value("${cielo.sftp.host}")
    private String sftpHost;
    @Value("${cielo.sftp.port}")
    private int sftpPort;
    @Value("${cielo.sftp.user}")
    private String sftpUser;
    @Value("${cielo.sftp.pass}")
    private String sftpPasword;
    @Value("${cielo.sftp.remotedir}")
    private String sftpRemoteDirectoryDownload;

    @Value("${cielo.sftp.localdir}")
    private String sftpLocalDirectoryDownload;
    @Value("${cielo.sftp.filter}")
    private String sftpRemoteDirectoryDownloadFilter;

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SessionFactory<LsEntry> sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost(sftpHost);
        factory.setPort(sftpPort);
        factory.setUser(sftpUser);
        factory.setPassword(sftpPasword);

        factory.setAllowUnknownKeys(true); //Set to true to allow connections to hosts with unknown (or changed) keys. Its default is 'false'. If false, a pre-populated knownHosts file is required.
        return new CachingSessionFactory<>(factory);
    }


    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE - 1)
    public SftpInboundFileSynchronizer sftpInboundFileSynchronizer(final SessionFactory<LsEntry> sftpSessionFactory) {
        SftpInboundFileSynchronizer fileSynchronizer =
                new SftpInboundFileSynchronizer(sftpSessionFactory);
        fileSynchronizer.setDeleteRemoteFiles(false);
        fileSynchronizer.setRemoteDirectory(sftpRemoteDirectoryDownload);
        fileSynchronizer
                .setFilter(new SftpSimplePatternFileListFilter(sftpRemoteDirectoryDownloadFilter)); //todo maybe use RegexPatternFileListFilter?
        return fileSynchronizer;
    }

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE - 2)
    @InboundChannelAdapter(channel = "fromSftpChannel", poller = @Poller(fixedDelay = "1000"))
    //@InboundChannelAdapter(channel = "fromSftpChannel", poller = @Poller(cron = "${cielo.sftp.poller.cron}"))

    public MessageSource<File> sftpMessageSource(final SftpInboundFileSynchronizer sftpInboundFileSynchronizer) {
        SftpInboundFileSynchronizingMessageSource source =
                new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer);
        source.setLocalDirectory(new File("/tmp/local"));
        source.setAutoCreateLocalDirectory(true);
        source.setLocalFilter(new AcceptOnceFileListFilter<File>());
        return source;
    }

    @Bean
    @ServiceActivator(
            inputChannel = "fromSftpChannel")
    public MessageHandler resultFileHandler() {
        return new MessageHandler() {
            @Override
            public void handleMessage(final Message<?> message) throws MessagingException {
                String payload = String.valueOf(message.getPayload());
                System.err.println(payload);
            }
        };
    }

    private static final SpelExpressionParser PARSER = new SpelExpressionParser();

    @Bean(name="fromSftpChannel")
    public MessageChannel fromSftpChannel() {
        return new PublishSubscribeChannel();
    }

    @Bean
    @ServiceActivator(inputChannel = "fromSftpChannel")
    @Order(Ordered.LOWEST_PRECEDENCE)
    public MessageHandler moveFile() {
        SftpOutboundGateway sftpOutboundGateway = new  SftpOutboundGateway(sftpSessionFactory(), AbstractRemoteFileOutboundGateway.Command.MV.getCommand(), "'/user1/upload/'.concat(" + PARSER.parseExpression("payload.getName()").getExpressionString() + ")");
        sftpOutboundGateway.setRenameExpressionString("'/user1/processed/'.concat(" + PARSER.parseExpression("payload.getName()").getExpressionString() + ")");
        sftpOutboundGateway.setRequiresReply(false);
        sftpOutboundGateway.setOutputChannelName("nullChannel");
        sftpOutboundGateway.setOrder(Ordered.LOWEST_PRECEDENCE);
        sftpOutboundGateway.setAsync(true);
        return sftpOutboundGateway;
    }

Terima kasih atas bantuan anda!

Saya melihat contoh dalam integrasi musim bunga - sftp untuk menamakan semula atau memindahkan fail dalam pelayan jauh selepas menyalin dan ia banyak membantu saya

Saya juga menyemak dokumentasi sftp intergation spring rasmi

Penyelesaian

Saya tidak pasti cara mengosongkan direktori jauh semasa permulaan. Tingkah laku ini perlu dinyahpepijat pada pihak anda. Tetapi saya boleh memberitahu anda mengapa anda melihat fail lama. Anda menamakan semula dari jauh selepas pemprosesan, tetapi salinan tempatan fail masih disimpan pada source.setLocalDirectory(new File("/tmp/local"));. Setelah anda selesai menamakan semula atau but semula, pertimbangkan untuk membersihkannya.

Anda juga boleh menyemak SftpStreamingMessageSource untuk menggantikan logik anda: https://docs.spring.io/spring-integration/reference/sftp/streaming.html

Atas ialah kandungan terperinci Intergation SFTP Spring: Mengendalikan memindahkan fail ke direktori lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam