Я никогда не делал этого, используя Spring Integration в каком-либо производственном коде, хотя я делал что-то подобное ниже, чтобы загружать файлы с удаленных серверов с помощью sftp / ftp.
Я использую только SftpOutboundGateway ( могут быть более эффективные способы ) для вызова метода "mget" и извлечения полезной нагрузки (файла).
@Configuration
@ConfigurationProperties(prefix = "sftp")
@Setter
@Getter
@EnableIntegration
public class RemoteFileConfiguration {
private String clients;
private String hosts;
private int ports;
private String users;
private String passwords;
@Bean(name = "clientSessionFactory")
public SessionFactory<LsEntry> clientSessionFactory() {
DefaultSftpSessionFactory sf = new DefaultSftpSessionFactory();
sf.setHost(hosts);
sf.setPort(ports);
sf.setUser(users);
sf.setPassword(passwords);
sf.setAllowUnknownKeys(true);
return new CachingSessionFactory<>(sf);
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler clientMessageHandler() {
SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(
clientSessionFactory(), "mget", "payload");
sftpOutboundGateway.setAutoCreateLocalDirectory(true);
sftpOutboundGateway.setLocalDirectory(new File("/users/localPath/client/INPUT/"));
sftpOutboundGateway.setFileExistsMode(FileExistsMode.REPLACE_IF_MODIFIED);
sftpOutboundGateway.setFilter(new AcceptOnceFileListFilter<>());
return sftpOutboundGateway;
}
}
@MessagingGateway
public interface SFTPGateway {
@Gateway(requestChannel = "sftpChannel")
List<File> get(String dir);
}
Чтобы убедиться, что мы используем cron длявыполнить это, я использовал тасклет, который выполняется Spring Batch, когда мне нужно использовать выражение cron.
@Slf4j
@Getter
@Setter
public class RemoteFileInboundTasklet implements Tasklet {
private RemoteFileTemplate remoteFileTemplate;
private String remoteClientDir;
private String clientName;
private SFTPGateway sftpGateway;
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext)
throws Exception {
List<File> files = sftpGateway.get(remoteClientDir);
if (CollectionUtils.isEmpty(files)) {
log.warn("No file was downloaded for client {}.", clientName);
return RepeatStatus.FINISHED;
}
log.info("Total file: {}", files.size());
return RepeatStatus.FINISHED;
}
}
ПРИМЕЧАНИЕ: Если вы не хотитеиспользуйте Tasklet Batch, вы можете использовать класс @Component
и ввести шлюз для вызова метода get.
@Autowired
private SFTPGateway sftpGateway;