1

因此,我创建了几个短流程,使用 SQS 作为处理段之间的后备存储。基本流程是:

RestController -> SQS Queue1 OCA
  SQS Queue1 MDCA -> Service-Adapter -> SQS Queue2 OCA
  SQS Queue2 MDCA -> Service Adapter

但是,我遇到了几个问题......“SQS Queue1 MDCA”使用 AWS 特定的消息头从队列中读取消息,这些消息头最终到达写入 Queue2 的出站适配器。这些消息标头指定 AWS_queue 名称、aws 消息 ID 等内容,这些内容会导致消息重新传递到 queue1。

一旦我过滤掉这些标头(我使用了一个简单的自定义转换器来测试它),outbound-channel-adapter 的属性就会按预期工作,并且 QueueMessagingTemplate 将消息传递到正确的队列。

所以,我对 spring-int 和 spring-aws 专家的问题是,“你认为过滤任何预先存在的 SQS 标头的合适位置是在哪里,以便它们不会被任何下游 SQS 处理拾取?” 在我看来,您想在 SQSHandler 中执行此操作,因为它们可能与任何基本 spring-aws-messaging 调用相关。

附带说明一下,从 SQS ICA 创建一条消息,并在流中创建一个 object-to-json 转换器,它还导致创建 12 个消息标头,这比 SQS 允许的多 2 个(导致消息传递失败)。

带有略微修改标题以保护无辜队列的示例消息...正如您所见,aws_queue、目的地等仍在从“wrench_workflow-mjg”读取的消息中,因此当尝试传递到下一个队列时,那些标头覆盖了 spring-int xml 配置中的配置,并且从未传递到下一个队列。该消息一直在 SQS 队列“wrench_workflow-mjg”中循环(在修复了 10 多个属性问题之后)。

GenericMessage [payload={"eventId":"event-1","eventStartDateTime":1476127827.201000000}, 
headers={aws_messageId=db9b6cc0-f133-4182-b79c-4d5d9717a3a9, ApproximateReceiveCount=1, 
SentTimestamp=1476127827803, id=0b662b72-f149-a970-5e63-64a1b28290fb, 
SenderId=AIDAJOYV7TECZCZCOK22C,
aws_receiptHandle=AQEBdaToWo9utbjBwADeSuChX/KrY3l8eoSBMZ0RMmbI8ewjJQw6tV74RwSYxWPKZBSzgJhCmfJ8AUX+
reOy2yGrmefULU7NS8nqYTdMW6BB4Ug2+mHIY+8Tze+2ws15FB5t96q3iJO8+tP5pl/xuo+CiTDv+
L1rlYkVODD0Yv1zosGKx48IhGOXdL8nJ4Im8bujcUNLJy/vEYD8Qcfsi6NHOF3Qn0A4Xw+Nva0wp86zfq,
aws_queue=wrench_workflow-mjg,
lookupDestination=wrench_workflow-mjg, 
ApproximateFirstReceiveTimestamp=1476127827886, timestamp=1476127836254}

如有必要,我可能会举一个例子,但我希望你明白我在没有什么。

4

1 回答 1

0

我们可能应该向适配器添加标头映射工具,以启用标头的选择性映射,就像我们在 Spring Integration 中的其他技术一样。

我打开了一个GitHub 问题

同时,您可以在出站适配器的上游立即放置一个<int:header-filter.../>(或转换器)以删除不需要的标头。HeaderFilter

您还可以将自定义请求处理程序建议添加到出站适配器。

于 2016-10-11T12:51:08.960 回答