2014-06-25 53 views
2

我正在嘗試使用Spring批處理與我已經構建的Spring批處理程序集成,但此時我只是試圖獲取Spring的工作示例整合在Spring IOSpring Example on GITHUB的幫助下。當本地目錄有任何內容時,SFTP入站通道適配器不復制文件

我已經自定義了示例程序,將遠程目錄中的所有文件一次性複製到本地,而其他一些細微的更改也是如此。該程序工作得很好,雖然它工作當且僅當本地目錄我複製到它沒有內容。

我試着重命名文件並運行程序,但仍然是同樣的問題。即使本地目錄具有隱藏的.DS_Store文件,程序也不會從遠程(SFTP)目錄複製內容,即文件。我想嘗試幾個可能性:即使有隱藏文件

  • 覆蓋具有相同名稱的
  • 僅複製文件IE的一個子集的文件,僅複製文件

    1. 複製文件尚未使用相同的名稱

    請原諒我的無知,我似乎錯過了標籤設置某些屬性。

    我的XML文件是相當如下了:

    <?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:task="http://www.springframework.org/schema/task" 
        xmlns:context="http://www.springframework.org/schema/context" 
        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/task http://www.springframework.org/schema/task/spring-task.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
         http://www.springframework.org/schema/integration/sftp http://www.springframework.org/schema/integration/sftp/spring-integration-sftp.xsd"> 
    
        <context:property-placeholder location="classpath:user.properties"/> 
    
        <bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory"> 
         <property name="host" value="${host}"/> 
         <property name="port" value="22"/> 
         <property name="user" value="${user}"/> 
        <property name="password" value="${password}"/> 
        </bean> 
    
        <int-sftp:inbound-channel-adapter id="sftpInbondAdapter" 
          channel="receiveChannel" 
          session-factory="sftpSessionFactory" 
          local-directory="file:${local.directory}" 
          remote-directory="${remote.directory}" 
          auto-create-local-directory="true" 
          delete-remote-files="false" 
          filename-pattern="*.txt"> 
         <int:poller max-messages-per-poll="-1" fixed-rate="1000" /> 
        </int-sftp:inbound-channel-adapter> 
    
        <int:channel id="receiveChannel"> 
         <int:queue/> 
        </int:channel> 
    
    </beans> 
    

    這裏的測試程序:

    public class SftpInboundReceiveSampleTest { 
    
        @Test 
        public void runDemo(){ 
         ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring/integration/SftpInboundReceiveSample-context.xml", this.getClass()); 
         PollableChannel localFileChannel = context.getBean("receiveChannel", PollableChannel.class); 
         System.out.println("Received first file message: " + localFileChannel.receive()); 
        } 
    } 
    

    更新: 操作系統:Mac OS X 10.9.3 Spring集成版:4.0.0.RELEASE 日誌:here

  • 回答

    1

    之前已經報道過,如果本地目錄不是空的,文件不會被複制,但是我在代碼中沒有看到這是可能的,我們從來沒有能夠重現這個問題。我不記得上一個問題的結果。

    所以:

    1. 應該只是工作 - 你可以打開調試日誌,看它是否提供任何線索?還請指明操作系統和Spring集成版本。
    2. 文件總是被複制(默認)並覆蓋本地版本;但是,如果文件已由應用程序的此實例處理,它們將不會生成消息(默認本地過濾器爲AcceptOnceFileListFilter)。自3.0以來,您可以將local-filter設置爲AcceptAllFileListFilter以始終生成一條消息 - 但您需要在處理該文件時刪除該文件,以避免在每次輪詢時一遍又一遍地發現該文件。或者,使用存儲lastModified日期以及文件名的FileSystemPersistentAcceptOnceFileListFilter,這樣可以檢測到文件已更改。
    3. 爲了防止重複文件被提取(不管#2),而不是filename-pattern,請使用代理到(a)SftpPersistentAcceptOnceFileListFilterSftpSimplePatternFileListFilterCompositeFileListFilter;如果文件通過兩個過濾器,該文件只會被提取。

    PS:我剛剛在OS X上測試了一個目錄/Users/foo/bar,其中bar有一個.DS_Store,它工作得很好。

    編輯:

    這裏是我的配置,做1,2,3 ...

    <int-sftp:inbound-channel-adapter id="sftpInbondAdapter" 
         channel="receiveChannel" 
         session-factory="sftpSessionFactory" 
         local-directory="/Users/.../Development/tmp" 
         remote-directory="foo" 
         auto-create-local-directory="true" 
         delete-remote-files="false" 
         filter="filter"> 
        <int:poller fixed-rate="1000" max-messages-per-poll="1"/> 
    </int-sftp:inbound-channel-adapter> 
    
    <int:channel id="receiveChannel"> 
        <int:queue/> 
    </int:channel> 
    
    <bean id="filter" class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
        <constructor-arg> 
         <list> 
          <bean class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter"> 
           <constructor-arg> 
            <bean class="org.springframework.integration.metadata.PropertiesPersistingMetadataStore" /> 
           </constructor-arg> 
           <constructor-arg value="foo" /> 
          </bean> 
          <bean class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter"> 
           <constructor-arg value="*.txt" /> 
          </bean> 
         </list> 
        </constructor-arg> 
    </bean> 
    
    ... 
    // logs showing existing present files sent to the channel 
    ... 
    16:44:54.465 WARN [task-scheduler-3][com.jcraft.jsch] Permanently added '10.0.0.3' (RSA) to the list of known hosts. 
    16:45:06.372 DEBUG [task-scheduler-3][org.springframework.integration.sftp.inbound.SftpInboundFileSynchronizer] 2 files transferred 
    16:45:12.704 DEBUG [task-scheduler-3][org.springframework.integration.endpoint.SourcePollingChannelAdapter] Received no Message during the poll, returning 'false' 
    16:45:40.056 DEBUG [task-scheduler-4][org.springframework.integration.sftp.inbound.SftpInboundFileSynchronizer] 0 files transferred 
    

    通知的2 files transferred0 files transferred

    我的日誌中沒有看到SftpInboundFileSynchronizer的日誌。請注意,我必須在測試應用程序中進行睡眠 - 如果您使用的是相同的應用程序;它在同步任何文件之前終止,如果文件已經存在;把Thread.sleep()放在那裏以阻止它終止。

    +0

    謝謝,我已經更新了所需信息的問題。 – oneworld

    +1

    用一些建議更新了答案。 –

    +0

    還要注意,在我們處理完所有現有本地文件(或者它們被過濾)之前,我們不會獲取任何遠程文件。 –

    相關問題