Spring Integration DSL SFTP的良好实践

时间:2016-06-16 21:38:00

标签: java spring spring-integration sftp

我目前正在尝试使用SI DSL SFTP功能推送一些文件。

我不是很流利使用这个fwk,所以我想知道是否有更好的方法来做我想要实现的目标。

它有点像这样工作,除非复制文件,其余的调用都处于超时状态......

奖励:SI DSL是否有一些好的读数(书籍或在线)? (除了咖啡馆si样品和参考..)

编辑:

  • 此SI流程是否遵循SI良好实践?
  • 为什么我的休息呼叫以超时结束,尽管文件已正确复制到sftp服务器?

Java配置:

    @Configuration
    @EnableIntegration
    @IntegrationComponentScan
    public class IntegrationConfig {

        //flow gateway
        @MessagingGateway
        public interface FlowGateway {
            @Gateway(requestChannel = "SftpFlow.input")
            Collection<String> flow(Collection<File> name);

        }

        //sftp flow bean
        @Bean
        public IntegrationFlow SftpFlow() {
             return f -> f
                .split()
                .handle(Sftp.outboundAdapter(this.sftpSessionFactory(), FileExistsMode.REPLACE)
                        .useTemporaryFileName(false)
                        .remoteDirectory(sftpFolder));
        }

        //sftp session config
        @Bean
        public DefaultSftpSessionFactory sftpSessionFactory() {
            System.out.println("Create session");
            DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
            factory.setHost(sftpHost);
            factory.setPort(Integer.valueOf(sftpPort));
            factory.setUser(sftpUser);
            factory.setPassword(sftpPwd);
            factory.setAllowUnknownKeys(true);
            return factory;
        }

}

RestController类:

@Autowired
private FlowGateway flowGateway;

@RequestMapping("/testSftp")
public String testSftp() {
    flowGateway.flow(Arrays.asList(file1, file2, file3);
}

1 个答案:

答案 0 :(得分:1)

  1. Spring Integration Java DSL完全基于Spring Integration Core。因此,所有概念,食谱,文档,样本等也都适用于此处。

  2. 但问题是什么?让我猜一下:&#34;为什么它超时并阻止?&#34;这对我来说是显而易见的,因为我知道在哪里阅读,但对其他人来说可能并不清楚。请在下次更具体一点:SO上有足够多的人可以关闭你的问题&#34;不清楚&#34;。

  3. 所以,让我们分析一下你有什么以及为什么它不像你一样。

    Spring Integration中的端点可以是one-waySftp.outboundAdapter())或request-replySftp.outboundGateway())。如果one-way没有任何东西可以返回并继续流程或发送回复,就像你的情况一样,这并不奇怪。

    我确定您对回复不感兴趣,否则您使用了不同的端点。

    在从.split()发送所有项目后,该过程完全停止,并且没有任何内容可以发送回@Gateway,因为您的代码暗示:

    Collection<String> flow(Collection<File> name);
    

    拥有非void返回类型需要reply下游流程中的requestChannel

    有关详细信息,请参阅Messaging Gateway

    还要考虑使用

    .channel(c -> c.executor(taskExecutor()))
    

    .split()之后将文件并行发送到SFTP。

    P.S。我不确定你需要阅读其他内容,因为到目前为止,代码中的所有内容都很好,只是这个讨厌的reply问题。