Как настроить spring -gration-sftp для перемещения удаленного файла после его загрузки в локальную файловую систему? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующая конфигурация kotlin для синхронизации файла sftp с удаленным сервером.

@Bean
fun sessionFactory(): SessionFactory<ChannelSftp.LsEntry> {
    val factory = DefaultSftpSessionFactory(true)
    factory.setHost(sftpHost)
    factory.setPort(sftpPort.toInt())
    factory.setUser(sftpUser)
    factory.setPassword(sftpPasword)
    factory.setAllowUnknownKeys(true)
    return CachingSessionFactory<ChannelSftp.LsEntry>(factory)
}

@Bean
fun template(): SftpRemoteFileTemplate {
    return SftpRemoteFileTemplate(sessionFactory())
}

@Bean
fun sftpInboundFileSynchronizer(): SftpInboundFileSynchronizer {
    val fileSynchronizer = SftpInboundFileSynchronizer(sessionFactory())
    fileSynchronizer.setDeleteRemoteFiles(false)
    fileSynchronizer.setRemoteDirectory(sftpRemoteDirectoryDownload)
    fileSynchronizer.setFilter(SftpPersistentAcceptOnceFileListFilter(PropertiesPersistingMetadataStore(), "downloaded"))
    return fileSynchronizer
}

@Bean
@InboundChannelAdapter(channel = "download", poller = [Poller(cron = "0/5 * * * * *")])
fun sftpMessageSource(): MessageSource<File> {
    val source = SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer())
    source.setLocalDirectory(File(sftpLocalDirectoryDownload))
    source.setAutoCreateLocalDirectory(true)
    source.setLocalFilter(FileSystemPersistentAcceptOnceFileListFilter(PropertiesPersistingMetadataStore(), "downloaded"))
    return source
}

@Bean
@ServiceActivator(inputChannel = "download", outputChannel = "move")
fun resultFileHandler(): MessageHandler {
    return MessageHandler { message -> publisher.handleMessage(message) }
}

@Bean
@ServiceActivator(inputChannel = "move")
fun sftpOutboundGateway(sessionFactory: SessionFactory<ChannelSftp.LsEntry>): SftpOutboundGateway {
    val gateway = SftpOutboundGateway(sessionFactory, "mv", "payload")
    gateway.setOutputChannelName("errorChannel")
    return gateway
}

Я хотел бы переместить файл после его загрузки с удаленного сервера;Однако я не нашел способ, который работает.В большинстве примеров используются конфигурации xml.

Все работает до вызова метода resultFileHandler, где я могу обработать локальный файл;однако MessageHandler не отправляется на канал move.Мне интересно, чего мне не хватает.

1 Ответ

0 голосов
/ 12 декабря 2018

Попробуйте использовать вместо 3 исходящих шлюзов

...LSgateway->splitter->GETgateway->process->MVgateway

Пример ftp демонстрирует аналогичную технику, но с RM, а не с MV (хотя используется конфигурация XML, потому что она довольно старая).

...