这里没有队列,因为每个 HTTP 请求都是在其自己的线程中执行的。是的,当 http 线程池耗尽时,您可能会在那里排队,但这在只有两个请求的简单用例中并不存在。
无论如何,您都可以在那里实现队列行为,但您应该声明您的toSftpChannel
as a QueueChannel
bean.
这样,下游进程将始终在同一线程上执行,并且下一条消息恰好在第一条消息之后从队列中提取。
See 参考手册 http://docs.spring.io/spring-integration/docs/4.3.11.RELEASE/reference/html/messaging-channels-section.html#polling-consumer了解更多信息。
UPDATE
自从你使用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
header 并在那里发送请求消息。由于我们不使用任何线程BridgeHandler
将在传输到 SFTP 完成后立即执行。
当然不是BridgeHandler
你可以有任何其他@ServiceActivator
or @Transfromer
作为回复而不是请求返回File
,但还有其他任何东西。例如:
@ServiceActivator(inputChannel = "toSftpChannel")
@Order(1)
public String transferComplete(File payload) {
return "The SFTP transfer complete for file: " + payload;
}