您在这里没有队列,因为每个HTTP请求都是在其自己的线程中执行的。正确,http线程池用尽时,您可能仍然在那儿排队,但是在您只有两个请求的简单用例中,这似乎并不存在。
无论如何,您都可以在那里实现队列行为,但是您应该将自己声明
toSftpChannel为
QueueChannelBean。
这样,下游进程将始终在同一线程上执行,并且下一个消息恰好在第一个消息之后从队列中拉出。
有关更多信息,请参见参考手册。
更新
由于您使用的
FtpMessageHandler是单向组件,但是您仍然需要对MVC控制器的方法进行一些答复,因此,唯一的方法就是拥有一个不返回的
@Gateway方法
void,当然,我们需要以某种方式发送答复。
为此,我建议使用
PublishSubscribeChannel:
@Bean@BridgeTopublic 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;}


