Home > database >  how to Spring integration SftpOutboundGateway setFilter Custom Argument?
how to Spring integration SftpOutboundGateway setFilter Custom Argument?

Time:09-29

How can I pass a parameter as a filter condition when getting the file list of the SFTP server from MessagingGateway?

My SftpMessageGateway code

@MessagingGateway
public interface SftpMessageGateway {
    @Gateway(requestChannel = "getSftpChannel")
    List<SftpFileInfo> getIconListByProductUiId(@Payloads("productUiId") String productUiId);

Integration Config

@Bean
public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(host);
    factory.setPort(port);
    factory.setUser(id);
    factory.setPassword(password);
    factory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<>(factory);
}

@Bean
@ServiceActivator(inputChannel = "getSftpChannel")
public MessageHandler getMessageHandler() {
    SftpOutboundGateway outboundGateway = new SftpOutboundGateway(sftpSessionFactory(), "ls", "'"   uploadPath   "'");
    outboundGateway.setOption(AbstractRemoteFileOutboundGateway.Option.NAME_ONLY);
    outboundGateway.setFilter(new SftpSimplePatternFileListFilter("*alpha*"));
    outboundGateway.setFilter(new SftpSimplePatternFileListFilter("I want get custom argument)); <----
    return outboundGateway;
    }

CodePudding user response:

You can set only one filter into a gateway, however there is a CompositeFileListFilter where you can combine a set of filters, include any custom impl of the FileListFilter.

See more info in docs: https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#remote-persistent-flf

CodePudding user response:

You can refer following code snippet for implementing FileListFilter. My use case was to fetch most latest file uploaded in SFTP directory.

@Component
public class LastModifiedFileFilter implements FileListFilter<LsEntry> {
    
    @Override
    public List<LsEntry> filterFiles(LsEntry[] files) {
        List<LsEntry> result = new ArrayList<LsEntry>();
        Vector<LsEntry> list = new Vector<LsEntry>();
        Collections.addAll(list, files);
        ChannelSftp.LsEntry lastModifiedEntry = Collections.max(list,
                (Comparator.comparingInt(entry -> entry.getAttrs().getMTime())));
        result.add(lastModifiedEntry);
        return result;
    }
}

Once you have your own custom filter in place then you need to 'Chain' it with your other filters in SftpOutboundGateway object. For your reference, I did it this way

    ChainFileListFilter<LsEntry> filterList = new ChainFileListFilter<LsEntry>();
    filterList.addFilter(new SftpSimplePatternFileListFilter("*alpha*"));
    filterList.addFilter(new LastModifiedFileFilter());
    setFilter(filterList);

For me, it will now fetch latest file having "alpha" string present in its name. Hope this helps.

  • Related