代码之家  ›  专栏  ›  技术社区  ›  Damien Walle

带有DSL的sftp出站网关的远程目录

  •  2
  • Damien Walle  · 技术社区  · 7 年前

    我对使用DSL的SFTP出站网关有问题。 我想使用出站网关发送文件,然后继续我的流程。 问题是我有一个例外告诉我:

    IllegalArgumentException: 'remoteDirectoryExpression' is required
    

    我看到我可以使用RemoteFileTemplate,在这里我可以设置sftp会话工厂和远程目录信息,但我想要的目录是在我的流中通过在批启动之前放在头中的代码定义的。

        @Bean
    public IntegrationFlow orderServiceFlow() {
        return f -> f
                .handleWithAdapter(h -> h.httpGateway("myUrl")
                        .httpMethod(HttpMethod.GET)
                        .expectedResponseType(List.class)
                )
                .split()
                .channel(batchLaunchChannel());
    }
    
    @Bean
    public DirectChannel batchLaunchChannel() {
        return MessageChannels.direct("batchLaunchChannel").get();
    }
    
    @Bean
    public IntegrationFlow batchLaunchFlow() {
        return IntegrationFlows.from(batchLaunchChannel())
                .enrichHeaders(h -> h
                        .headerExpression("oiCode", "payload")
                )
                .transform((GenericTransformer<String, JobLaunchRequest>) message -> {
                    JobParameters jobParameters = new JobParametersBuilder()
                            .addDate("exec_date", new Date())
                            .addString("oiCode", message)
                            .toJobParameters();
                    return new JobLaunchRequest(orderServiceJob, jobParameters);
                })
                .handle(new JobLaunchingMessageHandler(jobLauncher))
    
                .enrichHeaders(h -> h
                        .headerExpression("jobExecution", "payload")
                )
                .handle((p, h) -> {
                    //Logic to retreive file...
                    return new File("");
                })
                .handle(Sftp.outboundGateway(sftpSessionFactory,
                        AbstractRemoteFileOutboundGateway.Command.PUT,
                        "payload")
                )
                .get();
    }
    

    我不知道如何根据标头中的内容来告诉出站网关哪个将是目录。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Artem Bilan    7 年前

    这个 Sftp.outboundGateway() 具有重载版本 RemoteFileTemplate . 因此,您需要实例化 SftpRemoteFileTemplate bean并配置其:

    /**
     * Set the remote directory expression used to determine the remote directory to which
     * files will be sent.
     * @param remoteDirectoryExpression the remote directory expression.
     */
    public void setRemoteDirectoryExpression(Expression remoteDirectoryExpression) {
    

    这个可以是 FunctionExpression :

    setRemoteDirectoryExpression(m -> m.getHeaders().get("remoteDireHeader"))
    
        2
  •  1
  •   Damien Walle    7 年前

    在我得到答案之前,我提出了这个解决方案,但我不确定这是不是一个好的解决方案。

    // flow //
     .handle((p, h) -> {
        //Logic to retreive file...
        return new File("");
    })
    .handle(
            Sftp.outboundGateway(
                    remoteFileTemplate(new SpelExpressionParser().parseExpression("headers['oiCode']")),
                    AbstractRemoteFileOutboundGateway.Command.PUT,
                    "payload")
    )
    .handle(// next steps //)
    .get();
    
    public RemoteFileTemplate remoteFileTemplate(Expression directory) throws Exception {
            RemoteFileTemplate template = new SftpRemoteFileTemplate(sftpSessionFactory);
            template.setRemoteDirectoryExpression(directory);
            template.setAutoCreateDirectory(true);
            template.afterPropertiesSet();
            return template;
    }
    

    但这会引发警告,因为 ExpresionUtils java.lang.RuntimeException: No beanFactory