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

时间:2018-01-19 12:43:48

标签: spring-integration sftp dsl

我遇到使用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 个答案:

答案 0 :(得分:2)

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"))

答案 1 :(得分:1)

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

// 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