我目前正在尝试使用SI DSL SFTP功能推送一些文件。
我不是很流利使用这个fwk,所以我想知道是否有更好的方法来做我想要实现的目标。
它有点像这样工作,除非复制文件,其余的调用都处于超时状态......
奖励:SI DSL是否有一些好的读数(书籍或在线)? (除了咖啡馆si样品和参考..)
编辑:
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);
}
答案 0 :(得分:1)
Spring Integration Java DSL完全基于Spring Integration Core。因此,所有概念,食谱,文档,样本等也都适用于此处。
但问题是什么?让我猜一下:&#34;为什么它超时并阻止?&#34;这对我来说是显而易见的,因为我知道在哪里阅读,但对其他人来说可能并不清楚。请在下次更具体一点:SO上有足够多的人可以关闭你的问题&#34;不清楚&#34;。
所以,让我们分析一下你有什么以及为什么它不像你一样。
Spring Integration中的端点可以是one-way
(Sftp.outboundAdapter()
)或request-reply
(Sftp.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
问题。