2016-07-29 99 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; 
} 
}