我正在使用Spring Boot App从FTP服务器读取文件并将数据写入数据库。我正在使用Spring Integration FTP with streaming(FtpStreamingMessageSource)
@Bean
@InboundChannelAdapter(channel = "streamPHI", poller = @Poller(fixedDelay = "2000", maxMessagesPerPoll="-1"))
public MessageSource<InputStream> ftpMessageSourcePHI() {
FtpStreamingMessageSource messageSource = new FtpStreamingMessageSource(templatePhi, null);
messageSource.setRemoteDirectory(remoteDirectory);
messageSource.setFilter(new FtpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "streaming"));
return messageSource;
}
这是将此流转换为另一个频道
@Bean
@Transformer(inputChannel = "streamPHI", outputChannel = "data")
public org.springframework.integration.transformer.Transformer transformerPhi() {
return new StreamTransformer();
}
当轮询开始时,它成功获取文件,但也从远程FTP服务器删除文件。这不是必需的。任何人都可以提出可能的原因吗?
由于
----更新
但就我而言,我没有写任何东西来删除文件。在第一个“转换”之后,我使用了另一个转换,它将从字节到字符串获取文件的内容。然后,一个服务激活器解析并将其保存到数据库中。
@Bean
@Transformer(inputChannel = "data", outputChannel = "parse-shipping")
public org.springframework.integration.transformer.Transformer handler() {
return new ByteToStringTransformer();
}
@ServiceActivator(inputChannel = "parse-shipping")
public void parseShippingInformation(String shipFileContent){
...
}
@Component
public class ByteToStringTransformer extends AbstractTransformer {
@Override
protected Object doTransform(Message<?> message) throws Exception {
byte[] x = (byte[]) message.getPayload();
StringBuilder str = new StringBuilder();
for (byte b : x) {
str.append((char) b);
}
str.append(message.getHeaders().get("file_remoteFile"));
return str.toString();
}
}
FTP设置上是否有可能导致此问题的内容? (同时我也在考虑这个,但任何提示都会有所帮助)
答案 0 :(得分:0)
适配器中没有任何内容可以删除文件;事实上,文件提到......
与非流式入站通道适配器不同,此适配器默认情况下不会阻止重复。如果不删除远程文件(例如,使用带有
rm
命令的出站网关)并且希望防止再次处理文件,则可以在filter属性中配置FtpPersistentFileListFilter。如果您实际上不想保持状态,则可以将内存中的SimpleMetadataStore与过滤器一起使用。如果您还想使用文件名模式(或正则表达式),请使用CompositeFileListFilter。
其他内容必须删除您的文件。