Каталоги опросов Spring Integration - PullRequest
0 голосов
/ 22 января 2019

У меня есть случай, когда мне нужно загрузить файлы .fif с локального на удаленный сервер sftp в указанной структуре каталогов.Например:

enter image description here

Теперь некоторые другие серверы / приложения будут обрабатывать эти файлы .fif, генерировать файлы .npz и помещать их в выходную папку.соответствующего посещения / идентификатора.

Я могу загружать файлы, используя sftpOutboundAdapter, и он работает нормально.

Теперь я не могу понять, как добавить опрос, чтобы знать, что выходные файлы созданыв этом выходном каталоге этого посещения.Я не хочу загружать файлы в выходную папку.Я просто хочу знать, что создано 4 файла, чтобы я мог обновить статус посещения.

Код, который у меня пока есть,

@Value("${sftp.host}")
private String host;

@Value("${sftp.port:22}")
private int port;

@Value("${sftp.user}")
private String user;

@Value("${sftp.privateKey:#{null}}")
private Resource privateKey;

@Value("${sftp.privateKeyPassphrase:}")
private String privateKeyPassphrase;

@Value("${sftp.password:#{null}}")
private String password;

private final FileService fileService;

@Autowired
public SftpConfig(FileService fileService) {
    this.fileService = fileService;
}

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(host);
    factory.setPort(port);
    factory.setUser(user);
    if (privateKey != null) {
        factory.setPrivateKey(privateKey);
        factory.setPrivateKeyPassphrase(privateKeyPassphrase);
    } else {
        factory.setPassword(password);
    }
    factory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<LsEntry>(factory);
}

@Bean
public IntegrationFlow sftpOutboundFlow() {
    return IntegrationFlows.from("toSftpChannel")
            .handle(Sftp.outboundAdapter(this.sftpSessionFactory(), FileExistsMode.FAIL)
                            .remoteDirectoryExpression("headers['path']")
                            .useTemporaryFileName(false)
                            .autoCreateDirectory(true)
                            .fileNameGenerator(message -> (String) message.getHeaders().get("fileName"))
                    , c -> c.advice(expressionAdvice())
            ).get();
}

@Bean
public Advice expressionAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setSuccessChannelName("integrationFlow.input");
    advice.setOnSuccessExpressionString("payload");
    advice.setFailureChannelName("integrationFlow.input");
    advice.setOnFailureExpressionString("payload");
    advice.setTrapException(true);
    return advice;
}

@Bean
public IntegrationFlow integrationFlow() {
    return f -> f.handle((MessageHandler) fileService::OnFilesUpload);
}

@MessagingGateway
public interface UploadGateway {

    @Gateway(requestChannel = "toSftpChannel")
    void upload(@Payload File file, @Header("fileName") String fileName, @Header("path") String path,
                @Header("parentId") Long parentId);

}

Пожалуйста, дайте Java-конфигурацию того, какМогу ли я опросить родительский каталог, т.е. провайдеров, и узнать путь до выходной папки соответствующих посещений / идентификаторов, в которых создаются файлы .npz.а затем получите количество созданных файлов или список файлов.

1 Ответ

0 голосов
/ 22 января 2019

Используйте исходящий шлюз с командой LS (при необходимости он имеет рекурсивную опцию).

Просто отправьте удаленный каталог на шлюз, и он вернет список.

РЕДАКТИРОВАТЬ

Чтобы ответить на ваш комментарий ниже;Вы не показываете свой код вызова, но почему вы не можете сделать что-то подобное ...

@MessagingGateway
public interface UploadGateway {

    @Gateway(requestChannel = "toSftpChannel")
    void upload(@Payload File file, @Header("fileName") String fileName, @Header("path") String path,
            @Header("parentId") Long parentId);

    @Gateway(requestChannel = "toSftpLsGatewayChannel")
    List<LsEntry> getOutputFiles(String path);

}

и

this.gateway.upload(file, fileName, path, parentId);
List<LsEntry> outputs;
String outputPath = path.replace("/input", "/output");
do {
    outputs = this.gateway.getOutputFiles(outputPath);
    Thread.sleep(5_000);
} while (outputs == null || outputs.size() == 0);

Если вы хотите, чтобы он работал асинхронно, простозапустить вторую часть на исполнителе задач.

...