spring-integration-aws 流上的消息属性导致 SQS 消息循环,过滤它们的最佳位置在哪里?

Message attributes on spring-integration-aws flows cause SQS messages to loop, where's the best place to filter them?

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

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

但是,我 运行 遇到了几个问题... "SQS Queue1 MDCA" 使用 AWS 特定消息 Headers 从 queue 读取消息,最终到达写入 Queue2 的出站适配器。这些消息 headers 指定了诸如 AWS_queue 名称、aws 消息 ID 等内容,这导致消息成为 re-delivered 到 queue1。

一旦我将这些 headers 过滤掉(我使用一个简单的自定义 t运行sformer 来测试它),outbound-channel-adapter 的属性就会按预期工作并且 QueueMessagingTemplate 提供将消息发送到正确的 queue.

所以,我想问 spring-int 和 spring-aws 专家的问题是,"Where do you think the proper place to filter out any pre-existing SQS headers is so that they don't get picked up by any downstream SQS processing?" 在我看来,您可能想在 SQSHandler 中这样做,因为它们可能是相关的在任何基础 spring-aws-消息调用中。

附带说明一下,消息是从 SQS ICA 创建的,并且流程中有一个 object-to-json t运行sformer,它还导致 12 条消息 headers创建的数量比 SQS 允许的多 2 个(导致消息传递失败)。

示例消息 headers 稍微修改以保护无辜的 queues... 正如您所看到的 aws_queue、目的地等仍在消息中未被阅读从 "wrench_workflow-mjg" 以便在尝试传递到下一个 queue 时,那些 headers 覆盖了 spring-int xml 配置中的配置并且从未传递到下一个 queue。该消息一直循环通过 SQS queue "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}

如果有必要,我可能会举一个例子,但我希望你能理解我的意思。

我们可能应该向适配器添加 header-mapping 设施以启用 headers 的选择性映射,就像我们在 Spring 集成中对其他技术所做的那样。

我开了一个GitHub Issue

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

您还可以向出站适配器添加自定义 Request Handler Advice