2014-09-10 65 views
2

我想利用Spring集成启动消息文件出现在远程位置,而不实际传输它们。我所需要的只是生成一个消息,例如标题值指示文件和文件名的路径。Spring集成FTP - 无需传输的轮询?

完成此操作的最佳方法是什么?我已经尝试使用服务激活器将FTP入站通道适配器串在一起以编写我需要的标头值,但是这会导致文件被传输到本地临时目录,并且在服务激活器看到它时,一个java.io.File引用本地文件,远程路径信息不见了。在发生本地传输之前可以转换消息吗?

+0

我也尝试过使用变压器而不是服务激活器来查看消息中是否会出现一些差异。不,它仍然携带一个指向本地文件的java.io.File作为有效内容,而不包含标识原始远程位置的标头。 – Jeff 2014-09-11 13:14:23

回答

2

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

<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"/> 

过滤器类只是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>改为将文件存储在您的服务激活方法中。

+1

这种基本的方法有效。请注意,filterFiles必须返回一个空列表,而不是像您的示例代码中那样错误。在我的情况下,我能够调用MessageTemplate在过滤器中的不同通道上发送新消息,然后始终返回一个空列表以避免在原始通道上进行任何文件下载或消息生成。这感觉有点像我们正在反对框架的设计,但我愿意接受它,因为我没有看到任何不涉及编写新型通道适配器的替代方案。 – Jeff 2014-09-22 14:04:02

+0

对不起。现在它被纠正了。 – 2014-09-22 14:22:32