您在这里没有队列,因为每个HTTP请求都是在其自己的线程中执行的。正确,http线程池用尽时,您可能仍然在那儿排队,但是在您只有两个请求的简单用例中,这似乎并不存在。
无论如何,您都可以在那里实现队列行为,但是您应该将自己声明toSftpChannel
为QueueChannel
Bean。
这样,下游进程将始终在同一线程上执行,并且下一个消息恰好在第一个消息之后从队列中拉出。
有关更多信息,请参见参考手册。
由于您使用的FtpMessageHandler
是单向组件,但是您仍然需要对MVC控制器的方法进行一些答复,因此,唯一的方法就是拥有一个不返回的@Gateway
方法void
,当然,我们需要以某种方式发送答复。
为此,我建议使用PublishSubscribeChannel
:
@Bean
@BridgeTo
public MessageChannel toSftpChannel() {
return new PublishSubscribeChannel();
}
@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
@Order(0)
public MessageHandler handler() {
SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
handler.setRemoteDirectoryExpression(new LiteralExpression("/"));
return handler;
}
这样,我们就有两个订阅者toSftpChannel
。使用,@Order(0)
我们确保@ServiceActivator
是第一个订户,因为我们需要首先执行SFTP传输。用,@BridgeTo
我们BridgeHandler
在相同的位置增加一秒钟PublishSubscribeChannel
。它的目的只是获取replyChannel
标头,然后在其中发送请求消息。由于我们不使用任何线程,因此BridgeHandler
将在完成向SFTP的传输后立即执行。
当然,BridgeHandler
除了您之外,您还可以拥有其他任何东西,@ServiceActivator
或者@Transfromer
返回其他信息而不是请求File
。例如:
@ServiceActivator(inputChannel = "toSftpChannel")
@Order(1)
public String transferComplete(File payload) {
return "The SFTP transfer complete for file: " + payload;
}