我最近一直在研究Spring Integration和AMQP(RabbitMQ),因为我需要使用异步方法传递两个应用程序(中间件和后端),以便中间件在接收客户端调用时不会阻塞
我首先采用更简单的方法在同步中实现它,这意味着我在中间件上有一个网关接口和一个出站网关(requireReply = true),然后在后端有一个入站网关和一个服务激活器。这种初始方法运行良好(我使用过Spring Integration XML配置)。
现在我需要澄清一下以非同步方式开展此工作的方法。
通过查看RabbitMQ教程6,最好使用回调队列和correlationId,根据我的理解,这类似于调用Spring RabbitTemplate的convertAndSend()然后receive(),而不是convertSendAndReceive()(它会阻塞直到收到响应)。
我已经检查了Spring Integration文档,我需要在中间件上替换网关接口,以便返回Future或ListenableFuture。
完成后,我还查看了outbound gateway的文档,其中说明它可以与RabbitTemplate一起管理correlationID和replyTo消息属性。
我的问题是:
答案 0 :(得分:0)
说实话,您不提供原始业务要求。可能事实上没有理由去处理这个async
切换,因为你有一个@Gateway
作为一个无线程的入口点,即使它被阻止等待回复它不会影响可能执行类似sendAndReceive
操作的其他线程。在大多数情况下,只需要在同一个请求者线程中执行所有操作,并且在转移到共享ThreadPoolExecutor
时不会失去性能。
是的,Future
允许您释放一个调用者以准备接受同一线程中的新请求。
由于它是MessagingGateway
并且您想要回复,因此有一个与请求关联的挂钩 - TemporaryReplyChannel
标头。这就是<outbound-gateway>
正常工作的原因:它为网关的return
(或FutureTask#set()
)阻止了该频道的回复。
我说我们可以通过您的异步回复要求获得相同的TemporaryReplyChannel
增益。
inbound
/ outbound
频道适配器对。<int-amqp:outbound-channel-adapter>
发送消息之前,您应该为<header-channels-to-string>
<header-enricher>
执行此操作。<int-amqp:inbound-gateway>
replyQueue
作为要通过<int-amqp:outbound-channel-adapter>
<int-amqp:inbound-channel-adapter>
配置replyQueue
。<int-amqp:outbound-channel-adapter>
配置客户端<int-amqp:inbound-gateway>
和mapped-request-headers="*"
,以允许将reply-channel
标头传播到服务器,反之亦然。<int-amqp:inbound-channel-adapter>
只会将回复发送到reply-channel
,而不是<int-amqp:outbound-gateway>
correlationId
,因为<int-amqp:inbound-gateway>
可能需要正确生成回复。嗯,那样的......
HTH
随意提出更多问题。如果我误解了你的问题,请纠正我。