Spring Integration FTP-无传输轮询



我想利用Spring Integration来启动关于出现在远程位置的文件的消息,而不需要实际传输它们。我所需要的只是生成一条消息,比如说,头值指示文件和文件名的路径。

实现这一目标的最佳方法是什么?我曾尝试将一个FTP入站通道适配器与一个服务激活器串在一起,以写入我需要的头值,但这会导致文件被传输到本地临时目录,当服务激活器看到它时,消息由一个java.io.file组成,该文件指代本地文件,并且远程路径信息不存在。是否可以在本地传输发生之前转换消息?

我们有类似的问题,我们用过滤器解决了它。在入站通道适配器上,您可以设置自定义筛选器实现。因此,在轮询之前,您的过滤器将被调用,您将获得有关文件的所有信息,例如,您可以从中决定是否下载该文件;

<int-sftp:inbound-channel-adapter id="test"
                                  session-factory="sftpSessionFactory"
                                  channel="testChannel"
                                  remote-directory="${sftp.remote.dir}"
                                  local-directory="${sftp.local.dir}"
                                  filter="customFilter"
                                  delete-remote-files="false">
    <int:poller trigger="pollingTrigger" max-messages-per-poll="${sftp.max.msg}"/>
</int-sftp:inbound-channel-adapter>
<beans:bean id="customFilter" class="your.class.location.SftpRemoteFilter"/>

Filter类只是FileListFilter接口的实现。这里是伪过滤器的实现。

public class SftpRemoteFilter implements FileListFilter<LsEntry> {
    private static final Logger log = LoggerFactory.getLogger(SftpRemoteFilter.class);
    @Override
    public final List<LsEntry> filterFiles(LsEntry[] files) {
       log.info("Here is files.");
       //Do something smart
       return Collections.emptyList();
    }
}

但是,如果您想像您所描述的那样做到这一点,我认为可以通过在有效负载上设置头,然后在使用该有效负载时使用相同的头来实现,但在这种情况下,您应该在服务激活器方法中使用Message<File>而不是File。

最新更新