2016-07-29 58 views
0

我正在嘗試使用:org.springframework.integration.ftp.gateway.ftpoutboundgateway從ftp端檢索ls信息。使用彈簧集成從FTP中檢索文件FtpOutboundGateway

從javadoc我明白我們可以執行像ls,mget命令通過FtpoOutboundGateway檢索信息。

我的問題是如何做到這一點?

我已經安裝了一個ftpSessionFactory。我已經使用FtpRemoteFileTemplate測試了這個會話,並且可以通過get()成功檢索一個文件。

但我失去了如何通過網關做到這一點。 我想通過編碼來做到這一點,而不是使用xml文件進行配置。

所以我做的是創建一個網關: 新的FtpOutboundGateway(defaultFtpSessionFactory,「ls -R」,null);

執行命令的下一步是什麼? (做ls從ftp端檢索)

我曾期待這實際上會觸發並可能檢索結果,但這對我來說完全不清楚。

我也找不到一個編碼示例(只是xml配置),或者從javadoc /集成文檔中獲取該示例如何執行此操作。

回答

0

FtpOutboundGateway是一個EIP組件,應在集成流場景中配置爲bean。

有了,你應該送Message一個端點inputChannel,該FtpOutboundGateway爲您執行的命令,並在與特定Message回覆其outputChannel

所有這些信息都可以在Spring Integration Reference Manual中找到,特別是here,如果你的目標是實現「xmlless」配置的話。

我們沒有一個FtpOutboundGateway Java的配置示例,但你可以找到在Spring集成的Java DSL test-cases東西:

@Bean 
public MessageHandler ftpOutboundGateway() { 
    return Ftp.outboundGateway(this.ftpSessionFactory, 
      AbstractRemoteFileOutboundGateway.Command.MGET, "payload") 
      .options(AbstractRemoteFileOutboundGateway.Option.RECURSIVE) 
      .regexFileNameFilter("(subFtpSource|.*1.txt)") 
      .localDirectoryExpression("@ftpServer.targetLocalDirectoryName + #remoteDirectory") 
      .localFilenameExpression("#remoteFileName.replaceFirst('ftpSource', 'localTarget')") 
      .get(); 
} 

@Bean 
public IntegrationFlow ftpMGetFlow() { 
    return IntegrationFlows.from("ftpMgetInputChannel") 
      .handle(ftpOutboundGateway()) 
      .channel(remoteFileOutputChannel()) 
      .get(); 
} 

另見https://github.com/spring-projects/spring-integration/pull/1860

0

感謝您的信息。我用你的信息來提出一個適合我需求的解決方案。我真的想使用網關給出的命令的抽象,而不是完整的集成方式。再次感謝您的信息。

我的解決方案如下,能夠使用網關功能而不使用完整的集成堆棧。我在這裏發佈了它,也許其他一些人可以使用它。此示例僅適用於ls命令,但可以輕鬆處理網關給出的所有命令。

class FtpGateway { 

@Autowired 
private DefaultFtpSessionFactory defaultFtpSessionFactory; 

private List<String> ftpFiles = new ArrayList<String>(); 

class ProcessCommandReturn extends AbstractMessageChannel { 

    @Override 
    protected boolean doSend(Message<?> message, long timeout) { 
     ftpFiles.clear(); 
     ArrayList<FileInfo> fileNames = (ArrayList<FileInfo>) message.getPayload(); 
     for (FileInfo filename : fileNames) { 
      ftpFiles.add(filename.getFilename()); 
     } 
     return true; 
    } 
} 

public List<String> getFileListFromFTP() throws IOException { 

    FtpOutboundGateway gw = new FtpOutboundGateway(defaultFtpSessionFactory, "ls", "'last*.zip'"); 
    // set return processing 
    MessageChannel ochannel = new ProcessCommandReturn(); 
    e.setOutputChannel(ochannel); 
    // make the gateway do it's work 
    gw.handleMessage(new GenericMessage("")); 
    return ftpFiles; 
} 
}