Rumah > Java > teks badan

Intergation SFTP Spring: Mengendalikan memindahkan fail ke direktori lain

WBOY
Lepaskan: 2024-02-09 14:18:09
ke hadapan
578 orang telah melayarinya

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;
    }
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan