Обсуждение весенней интеграции sftp

Я использую spring integration sftp для загрузки и выгрузки файлов. В документе я обнаружил

Spring Integration поддерживает отправку и получение файлов через SFTP, предоставляя три конечные точки на стороне клиента: адаптер входящего канала, адаптер исходящего канала и шлюз исходящей почты.

Когда я хочу загрузить файлы, я должен назначить локальный каталог, а когда я хочу загрузить файлы, я должен назначить удаленный каталог. Но если я не могу назначить каталог при написании кода, например, мой каталог связан с датой. могу ли я назначить каталог во время выполнения?

Вот мой код:

@Bean
public SessionFactory<LsEntry> sftpSessionFactory(){
    DefaultSftpSessionFactory defaultSftpSessionFactory = new DefaultSftpSessionFactory();
    defaultSftpSessionFactory.setHost(host);
    defaultSftpSessionFactory.setPort(Integer.parseInt(port));
    defaultSftpSessionFactory.setUser(username);
    defaultSftpSessionFactory.setPassword(password);
    defaultSftpSessionFactory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<LsEntry>(defaultSftpSessionFactory);
}

@Bean
public SftpRemoteFileTemplate sftpRemoteFileTemplate(){
    SftpRemoteFileTemplate sftpRemoteFileTemplate = new SftpRemoteFileTemplate(sftpSessionFactory());
    return sftpRemoteFileTemplate;
}

@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handlerGet() {
    SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(sftpSessionFactory(), "mget", "payload");
    sftpOutboundGateway.setLocalDirectory(new File(localDirectory));
    sftpOutboundGateway.setFilter(new SftpSimplePatternFileListFilter("*.txt"));
    sftpOutboundGateway.setSendTimeout(1000);
    return sftpOutboundGateway;
}

В messageHandler я должен назначить localDirectory в outboundGateway. И когда я хочу изменить свой localDirectory по дням, я должен загрузить файл в localDirectory и перейти в целевой каталог. Как я могу назначить localDirectory во время выполнения. Например, сегодня я загружаю на 20170606 /, а завтра я загружаю на 20170607?

редактировать

это мой вариант и тест

public interface OutboundGatewayOption {
    @Gateway(requestChannel = "sftpChannel")
    public List<File> getFiles(String dir);
}

@Test
public void test2(){
    outboundGatewayOption.getFiles("upload/20160920/");
}

person linghu    schedule 06.04.2017    source источник


Ответы (1)


sftpOutboundGateway.setLocalDirectoryExpression(
    new SpelExpressionParser().parseExpression("headers['whereToPutTheFiles']");

or parseExpression("@someBean.getDirectoryName(payload)")

и т.п.

Выражение должно оцениваться как String, представляющий абсолютный путь к каталогу.

При вычислении выражения удаленный каталог доступен как переменная #remoteDirectory.

person Gary Russell    schedule 06.04.2017
comment
Спасибо за ваш ответ. Теперь я заменяю setLocalDirectory на sftpOutboundGateway.setLocalDirectoryExpression(new SpelExpressionParser().parseExpression("headers['/Users/linghu/testfile/']"));. И когда я запускаю тест для загрузки файла, тест прошел, но файл не загружен. Где неправильно. Я не понимаю, что это работает, не могли бы вы дать мне несколько образцов? - person linghu; 07.04.2017
comment
Кажется, вы неправильно поняли, если вам нужна переменная, тогда вам нужно выражение, в котором результат может меняться для каждого сообщения. Чтобы использовать выражение headers, вам нужно будет установить заголовок в восходящем направлении от шлюза, возможно, с помощью средства обогащения заголовка, чтобы установить myHeader на '/Users/ling‌​hu/testfile/' перед отправкой сообщения на шлюз; затем используйте headers['myHeader;]. То, что у вас есть, будет пытаться найти значение из заголовка с именем /Users/ling‌​hu/testfile.. Если вы используете шлюз обмена сообщениями для отправки сообщения из Java-программы на шлюз, вы можете установить заголовок там. - person Gary Russell; 07.04.2017
comment
Извините, что отвечаю так поздно. Я нахожу эти ссылки образец XML sftp для весенней интеграции. И я установил localDirectory с sftpOutboundGateway.setLocalDirectoryExpression(new SpelExpressionParser().parseExpression("'download'+#remoteDirectory"));. Теперь он работает, большое спасибо за ваш ответ. - person linghu; 24.04.2017