【问题标题】:Message attributes on spring-integration-aws flows cause SQS messages to loop, where's the best place to filter them?spring-integration-aws 流上的消息属性导致 SQS 消息循环,过滤它们的最佳位置在哪里?
【发布时间】:2017-02-19 09:06:25
【问题描述】:

因此,我创建了几个短流程,使用 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}

如果有必要,我可能会整理一个例子,但我希望你能理解我在没有的情况下会得到什么。

【问题讨论】:

    标签: spring-integration spring-cloud-aws


    【解决方案1】:

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

    我开了一个GitHub Issue

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

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

    【讨论】:

    • 就在你的脑海中,上面的标头映射实现的例子在哪里?
    • 紧接在出站适配器之前;如果你能告诉我你使用的是xml还是@Bean配置,我可以用config编辑我的答案。
    • 谢谢,但没必要。我们是 spring-int 的重度用户,我们已经实施了您建议的解决方法。如果我们能把这个项目搞定,而且我能抽出一些时间,我也会在 GitHub 问题上尝试一下。
    • (哦,我们倾向于将 XML 用于流定义 - 具有讽刺意味的是,使用它来查看流似乎比更长的 java 配置更容易。尽管 java DSL 对于简单的流看起来相当不错。
    • 我的第一个回复是询问有关 github 问题的问题 - 我应该在那里问。再次感谢!
    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多