弹簧集成SFTP示例与Spring Boot

时间:2016-12-14 20:26:49

标签: java spring-integration sftp

我们正在使用最新的Spring Boot for Spring应用程序并使用最新的Spring Integration for SFTP。我去过Spring Integration SFTP文档站点,我按原样使用了Spring Boot配置:

 @Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost("localhost");
    factory.setPort(port);
    factory.setUser("foo");
    factory.setPassword("foo");
    factory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<LsEntry>(factory);
}

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setRemoteDirectory("/");
    fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.xml"));
    return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(channel = "sftpChannel")
public MessageSource<File> sftpMessageSource() {
    SftpInboundFileSynchronizingMessageSource source =
            new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
    source.setLocalDirectory(new File("ftp-inbound"));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}

@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            System.out.println(message.getPayload());
        }

    };
}

让我明确一下,在切割和粘贴之后,会有一些单元测试运行。但是,在加载应用程序上下文时出现错误消息,因为轮询不存在。

当我搜索该错误时,StackOverflow上的其他帖子说我还必须添加以在加载应用程序上下文时删除此错误消息。

@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata defaultPoller() {

    PollerMetadata pollerMetadata = new PollerMetadata();
    pollerMetadata.setTrigger(new PeriodicTrigger(60));
    return pollerMetadata;
}

当我添加此代码时,那么至少我的构建将起作用并且测试将运行,因为现在正在正确加载应用程序上下文。

现在我正在寻找有关如何使这项工作和移动文件的代码示例? GitHub上的Spring Integration SFTP示例是可以的,但不是很好......远非如此。

Basic Spring集成示例显示了如果使用application-context.xml文件配置数据,如何从SFTP服务器读取文件。使用Spring Boot配置的示例在哪里,然后是从该服务器读取的代码以及测试代码?

据我所知,无论您是使用Java类进行Spring Boot配置还是使用application-context.xml文件......对于自动装配的SFTP通道和某些入站通道适配器,工作代码的工作方式应该相同。

所以这是代码,我正在努力工作:

@Component
@Profile("sftpInputFetch")
public class SFTPInputFetcher implements InputFetcher
{
    // The PollableChannel seems fine
    @Autowired
    PollableChannel sftpChannel;

    @Autowired
    SourcePollingChannelAdapter sftpChannelAdapter;

@Override
public Stream<String> fetchLatest() throws FileNotFoundException
{
    Stream<String> stream = null;
    sftpChannelAdapter.start();
    Message<?> received = sftpChannel.receive();
    File file = (File)received.getPayload();
    // get Stream<String> from file
    return stream;
}

目前,&#34; sftpChannelAdapter.start();&#34;是我遇到麻烦的部分。 此实现未找到&#34; SourcePollingChannelAdapter&#34;类。

如果在经典的XML应用程序上下文中使用&#34; id&#34;那么这段代码就可以了。使用Spring Boot配置,看起来您可以定义一个&#34; id&#34;对于一个豆子。

这仅仅源于我对如何使用传统的应用程序上下文XML文件(在代码中使用注释)转换为使用完整的Spring Boot应用程序上下文配置文件缺乏知识。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

我不明白这个问题;你说

  

我必须添加...以使其正常工作

然后

  

现在我正在寻找有关如何使其工作的代码示例?

什么不起作用?

您也可以使用

@InboundChannelAdapter(value = "sftpChannel", poller = @Poller(fixedDelay = "5000"))

而不是添加默认的轮询器定义。

我们将fix the docs for the missing poller config

修改

我刚刚将代码复制到一个新的启动应用程序(使用poller配置),它按预期工作。

@SpringBootApplication
public class SftpJavaApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(SftpJavaApplication.class).web(false).run(args);
    }

    @Bean
    public SessionFactory<LsEntry> sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost("...");
        factory.setPort(22);
        factory.setUser("...");
        factory.setPassword("...");
        factory.setAllowUnknownKeys(true);
        return new CachingSessionFactory<LsEntry>(factory);
    }

    @Bean
    public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
        SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
        fileSynchronizer.setDeleteRemoteFiles(false);
        fileSynchronizer.setRemoteDirectory("foo");
        fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.txt"));
        return fileSynchronizer;
    }

    @Bean
    @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "5000"))
    public MessageSource<File> sftpMessageSource() {
        SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
                sftpInboundFileSynchronizer());
        source.setLocalDirectory(new File("ftp-inbound"));
        source.setAutoCreateLocalDirectory(true);
        source.setLocalFilter(new AcceptOnceFileListFilter<File>());
        return source;
    }

    @Bean
    @ServiceActivator(inputChannel = "sftpChannel")
    public MessageHandler handler() {
        return new MessageHandler() {

            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                System.out.println(message.getPayload());
            }

        };
    }

}

结果:

16:57:59.697 [task-scheduler-1] WARN  com.jcraft.jsch - Permanently added '10.0.0.3' (RSA) to the list of known hosts.
ftp-inbound/bar.txt
ftp-inbound/baz.txt