我想利用Spring Integration启动出现在远程位置的关于文件的消息,而不实际传输它们。我需要的只是生成一个消息,例如,标题值指示文件和文件名的路径。
实现这一目标的最佳方法是什么?我已经尝试将FTP入站通道适配器与服务激活器串在一起以编写我需要的标头值,但这会导致文件被转移到本地临时目录,并且当服务激活器看到它时,消息包含一个引用本地文件的java.io.File,远程路径信息消失了。可以在发生本地传输之前转换消息吗?
答案 0 :(得分: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"/>
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();
}
}
但是如果你想按照你所描述的那样做,我认为可以通过在有效负载上设置标头然后在使用该有效负载时使用相同的标头来实现,但在这种情况下你应该使用{{1}在服务激活方法中使用File。