Интеграция Spring для sftp

Как переместить файл из локальной системы на удаленный FTP с помощью адаптера SFTP. Я просматриваю примеры, и все они упоминают о копировании файлов с удаленного FTP на локальный компьютер.

Мне нужно переместить файлы с локального компьютера в удаленную системную папку.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-sftp="http://www.springframework.org/schema/integration/sftp"
xmlns:file="http://www.springframework.org/schema/integration/file"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration
    http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/sftp
    http://www.springframework.org/schema/integration/sftp/spring-integration-sftp-    2.2.xsd
    http://www.springframework.org/schema/integration/file
    http://www.springframework.org/schema/integration/file/spring-integration-file-2.2.xsd">

<bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<property name="host" value="localhost"/>
<property name="user" value="user01"/>
<property name="password" value="abc123"/>
<property name="port" value="990"/>
</bean>

<int:channel id="sftpChannel"/>

<file:inbound-channel-adapter directory="#{T(System).getProperty('java.io.tmpdir')}" id="fileInbound"
                          channel="sftpChannel" filename-pattern="*.xml">
<int:poller fixed-rate="1000" max-messages-per-poll="100"/>
</file:inbound-channel-adapter>

<int-sftp:outbound-channel-adapter id="sftpOutboundAdapter" session-factory="sftpSessionFactory"
                               channel="sftpChannel" charset="UTF-8" remote-directory="/"
                               remote-file-separator="/"/>

</beans>

<file:outbound-channel-adapter id="moveProcessedFile"
    channel="sftpChannel"
    directory="file:#{configurationService.configuration.getProperty('acal.jde.publish.folder')}/processed"
    delete-source-files="true" order="2" />

Я пробовал это, но не смог переместить файл в обработанную папку.


person sree    schedule 24.09.2013    source источник
comment
Вам нужно только outbound-channel-adapter, чтобы поместить файл в SFTP. Что вы используете для размещения полезной нагрузки в inputChannel?   -  person Dmitry Kuskov    schedule 24.09.2013
comment
Кстати, вы действительно можете увидеть пример, который помещает файл в удаленный каталог через SFTP здесь   -  person Dmitry Kuskov    schedule 24.09.2013
comment
@Dmitry Значит, мне нужно определить только адаптер исходящего канала? если да, то как я могу настроить локальную папку, в которой нужно выбрать файл?   -  person sree    schedule 24.09.2013
comment
Вы не указываете это в outbound-channel-adapter, вы указываете только входной канал. И то, как вы помещаете данные в этот канал, зависит от вас: вы можете, например, создать цепочку, которая будет читать локальный каталог и записывать полезную нагрузку в inputChannel, или вы можете читать файл и вручную помещать его в качестве полезной нагрузки в кукурузное задание, и многие другие варианты, вы должны решить, какой из них вам больше подходит. В приведенной выше ссылке MessageChannel.send вызывается явно, а экземпляр канала получается из контекста приложения - это тоже вариант.   -  person Dmitry Kuskov    schedule 24.09.2013
comment
@Dmitry Спасибо за ввод. Я добавил канал и прочитал файлы, а затем вызвал конфигурации outbound-channel-adapter.edit выше, но файлы по-прежнему не перемещаются. Не могли бы вы мне помочь?   -  person sree    schedule 24.09.2013
comment
Почему у вас sftpSessionFactory как channel в inbound-channel-adapter? Он должен определять канал сообщений, на который должна быть перенаправлена ​​полезная нагрузка, поэтому в вашем случае кажется, что это должно быть publishToSFTPChannel. А зачем использовать publish-subscribe-channel? Достаточно простого двухточечного канала.   -  person Dmitry Kuskov    schedule 24.09.2013


Ответы (1)


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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-sftp="http://www.springframework.org/schema/integration/sftp"
   xmlns:file="http://www.springframework.org/schema/integration/file"
   xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/integration
        http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/integration/sftp
        http://www.springframework.org/schema/integration/sftp/spring-integration-sftp-2.2.xsd
        http://www.springframework.org/schema/integration/file
        http://www.springframework.org/schema/integration/file/spring-integration-file-2.2.xsd">

<bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <property name="host" value="localhost"/>
    <property name="user" value="user01"/>
    <property name="password" value="abc123"/>
    <property name="port" value="990"/>
</bean>

<int:channel id="sftpChannel"/>

<file:inbound-channel-adapter directory="#{T(System).getProperty('java.io.tmpdir')}" id="fileInbound"
                              channel="sftpChannel" filename-pattern="*.xml">
    <int:poller fixed-rate="1000" max-messages-per-poll="100"/>
</file:inbound-channel-adapter>

<int-sftp:outbound-channel-adapter id="sftpOutboundAdapter" session-factory="sftpSessionFactory"
                                   channel="sftpChannel" charset="UTF-8" remote-directory="/"
                                   remote-file-separator="/"/>

</beans>

Проблемы с вашей конфигурацией:

  1. Вы используете sftpSessionFactory как канал в inbound-channel-adapter. Он должен определять канал сообщения, на который должна быть перенаправлена ​​полезная нагрузка, поэтому в вашем случае кажется, что это должно быть publishToSFTPChannel
  2. publish-subscribe-channel используется вместо простого двухточечного канала
person Dmitry Kuskov    schedule 24.09.2013
comment
Спасибо, у меня это сработало. Затем я попытался переместить файлы в обработанную папку и не смог переместить файлы в папку. Не могли бы вы посмотреть мою конфигурацию, пожалуйста. - person sree; 25.09.2013
comment
Я думаю, вам лучше каждый раз создавать новый вопрос, а не изменять существующий. Есть несколько способов справиться с этим. sftpChannel сейчас является прямым каналом, поэтому использовать его может только один потребитель. Вы можете, например, создать сплиттер или маршрутизатор, чтобы отправлять сообщения по разным каналам для каждого адаптера. Кроме того, publish-subscribe-channel может быть действительно полезен для вас сейчас - вы можете читать локальный файл, а затем он будет отправлен в качестве полезной нагрузки как на SFTP, так и на исходящие адаптеры файлов. - person Dmitry Kuskov; 25.09.2013
comment
это int: channel id = sftpChannel что-то по умолчанию, или это похоже на то, что у меня может быть int: channel id = _rd - person rd_; 07.08.2019