因此,我创建了几个短流程,使用 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}
如有必要,我可能会举一个例子,但我希望你明白我在没有什么。