使用java代码动态设置ftp:inbound-channel-adapter的属性

时间:2014-07-17 07:57:27

标签: java ftp spring-integration

是否有机会从java代码中的入站通道适配器更改/设置某些属性的值? 我需要从ftp服务器下载特定文件。在运行应用程序之前我不知道哪个文件,所以我必须动态设置filename-pattern。 我发现了一个关于此的问题,但没有正确答案,所以我再问一遍。 这是我的inbound-channel-adapter配置:

    <int-ftp:inbound-channel-adapter local-directory="ftp" 
            channel="getFtpChannel" 
            session-factory="ftpClientFactory" 
            charset="UTF-8"
            remote-directory="${remote-download-directory}"
            remote-file-separator="/"
            auto-create-local-directory="true"
            delete-remote-files="false"
            filename-pattern="">
    <int:poller fixed-rate="10000"/>
</int-ftp:inbound-channel-adapter>

我想设置/更改filename-pattern。 这是我的代码根据此属性接收文件,但仅当我在我的配置中设置它时:

ConfigurableApplicationContext context = 
        new FileSystemXmlApplicationContext("/src/citrus/resources/citrus-context.xml");
PollableChannel channel = 
        context.getBean("getFtpChannel", PollableChannel.class);
channel.receive();
try {
    Thread.sleep(10000);
} catch (InterruptedException e) {
    fail(e.getMessage());
}
context.close();

1 个答案:

答案 0 :(得分:2)

不能在运行时更改filename-pattern,因为该选项已填充到FtpSimplePatternFileListFilter final path

但是,您可以实施自己的FileListFilter<?>并将其注入filter的{​​{1}}选项。

由于你的<int-ftp:inbound-channel-adapter>将是一个bean,你只需从上下文中获取它并调用它FileListFilter<?>

<强>更新

这样的事情:

setPattern()

用法

public class MyFtpPatterFileListFilter extends AbstractFileListFilter<FTPFile> {

    private final AntPathMatcher matcher = new AntPathMatcher();

    private volatile String pattern;

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }

    @Override
    protected boolean accept(FTPFile file) {
        return !StringUtils.hasText(this.pattern) || this.matcher.match(this.pattern, this.getFilename(file));
    }

    private String getFilename(FTPFile file) {
        return (file != null) ? file.getName() : null;
    }

}

并修改:

<int-ftp:inbound-channel-adapter filter="myFtpFilter">