需要验证方法:Spring Integration + AMQP + Async

时间:2015-03-29 15:24:34

标签: asynchronous spring-integration spring-amqp

我最近一直在研究Spring Integration和AMQP(RabbitMQ),因为我需要使用异步方法传递两个应用程序(中间件和后端),以便中间件在接收客户端调用时不会阻塞

我首先采用更简单的方法在同步中实现它,这意味着我在中间件上有一个网关接口和一个出站网关(requireReply = true),然后在后端有一个入站网关和一个服务激活器。这种初始方法运行良好(我使用过Spring Integration XML配置)。

现在我需要澄清一下以非同步方式开展此工作的方法。

通过查看RabbitMQ教程6,最好使用回调队列和correlationId,根据我的理解,这类似于调用Spring RabbitTemplate的convertAndSend()然后receive(),而不是convertSendAndReceive()(它会阻塞直到收到响应)。

我已经检查了Spring Integration文档,我需要在中间件上替换网关接口,以便返回Future或ListenableFuture。

Async Gateway

完成后,我还查看了outbound gateway的文档,其中说明它可以与RabbitTemplate一起管理correlationID和replyTo消息属性。

我的问题是:

  1. 为了使用异步方法工作,我应该继续使用出站/入站网关,而不是出站/入站消息转换器吗?
  2. 如果遵循出站/入站消息转换器方法(听起来像RabbitMQ教程所示),如何将网关接口上的Future与来自入站通道适配器的结果相关联?< / LI>

1 个答案:

答案 0 :(得分:0)

说实话,您不提供原始业务要求。可能事实上没有理由去处理这个async切换,因为你有一个@Gateway作为一个无线程的入口点,即使它被阻止等待回复它不会影响可能执行类似sendAndReceive操作的其他线程。在大多数情况下,只需要在同一个请求者线程中执行所有操作,并且在转移到共享ThreadPoolExecutor时不会失去性能。

是的,Future允许您释放一个调用者以准备接受同一线程中的新请求。

由于它是MessagingGateway并且您想要回复,因此有一个与请求关联的挂钩 - TemporaryReplyChannel标头。这就是<outbound-gateway>正常工作的原因:它为网关的return(或FutureTask#set())阻止了该频道的回复。

我说我们可以通过您的异步回复要求获得相同的TemporaryReplyChannel增益。

  1. 您应该使用inbound / outbound频道适配器对。
  2. 在向<int-amqp:outbound-channel-adapter>发送消息之前,您应该为<header-channels-to-string> <header-enricher>执行此操作。
  3. 服务器端可能相同 - <int-amqp:inbound-gateway>
  4. 您应该使用已修复 replyQueue作为要通过<int-amqp:outbound-channel-adapter>
  5. 发送的邮件的标头
  6. 应为已修复 <int-amqp:inbound-channel-adapter>配置replyQueue
  7. 必须为<int-amqp:outbound-channel-adapter>配置客户端<int-amqp:inbound-gateway>mapped-request-headers="*",以允许将reply-channel标头传播到服务器,反之亦然。
  8. 客户端的<int-amqp:inbound-channel-adapter>只会将回复发送到reply-channel,而不是<int-amqp:outbound-gateway>
  9. 您可能需要手动处理correlationId,因为<int-amqp:inbound-gateway>可能需要正确生成回复。
  10. 嗯,那样的......

    HTH

    随意提出更多问题。如果我误解了你的问题,请纠正我。