Spring集成FTP-无传输轮询?

Spring集成FTP-无传输轮询?,spring,ftp,message,spring-integration,poller,Spring,Ftp,Message,Spring Integration,Poller,我想利用SpringIntegration来启动关于出现在远程位置的文件的消息,而不实际传输它们。我所需要的只是生成一条消息,比如说,头值指示文件路径和文件名 实现这一目标的最佳方式是什么?我尝试将FTP入站通道适配器与service activator串连在一起,以写入所需的头值,但这会导致文件被传输到本地临时目录,当service activator看到它时,消息由一个java.io.file组成,该文件引用本地文件,远程路径信息消失。是否可以在本地传输发生之前转换消息?我们有类似的问题,我

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


实现这一目标的最佳方式是什么?我尝试将FTP入站通道适配器与service activator串连在一起,以写入所需的头值,但这会导致文件被传输到本地临时目录,当service activator看到它时,消息由一个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();
    }
}
公共类SftpRemoteFilter实现FileListFilter{
私有静态最终记录器log=LoggerFactory.getLogger(SftpRemoteFilter.class);
@凌驾
公共最终列表筛选器文件(LsEntry[]文件){
log.info(“这是文件”);
//做点聪明的事
返回集合。emptyList();
}
}

但是如果你想按照你描述的那样做,我认为可以通过在有效载荷上设置头,然后在使用有效载荷时使用相同的头,但是在这种情况下,您应该在service activator方法中使用
消息
而不是文件。

我还尝试使用转换器而不是service activator,以查看消息中是否存在一些差异。不,它仍然携带一个指向本地文件的java.io.File作为有效负载,没有标识原始远程位置的头文件。请注意,filterFiles必须返回一个空列表,而不是像示例代码中那样返回false。在我的例子中,我能够调用MessageTemplate在过滤器中的不同通道上发送新消息,然后始终返回空列表,以避免在原始通道上下载任何文件或生成消息。这感觉有点像我们在反对框架的设计,但我愿意接受它,因为我看不到任何不涉及编写新型通道适配器的替代方案。