因此,场景很简单:我想将 google 的 pubsub 模拟器配置为具有死信队列主题,并且如果消息导致处理程序中出现异常,则该消息应转发到死信队列主题。然后我希望能够订阅该主题并从中提取死信。我在生产者和消费者中使用 spring-cloud-gcp-starter-pubsub, 然后使用以下 shell 命令来启动和配置模拟器:
gcloud beta emulators pubsub start --project=local-test --host-port=0.0.0.0:8080
然后完全站起来,
curl -X PUT -v http://localhost:8080/v1/projects/local-test/topics/fam-task
curl -X PUT -v http://localhost:8080/v1/projects/local-test/topics/dead-letter
curl -X PUT 'http://localhost:8080/v1/projects/local-test/subscriptions/subscription-task-reactor-fam-task' \
--header 'Content-Type: application/json' --data '{"topic": "projects/local-test/topics/fam-task", "enableMessageOrdering": true, "enableExactlyOnceDelivery": true, "deadLetterPolicy": {"deadLetterTopic": "projects/local-test/topics/dead-letter", "maxDeliveryAttempts": 5}}'
echo "Create dead letter subscriptions"
curl -X PUT 'http://localhost:8080/v1/projects/local-test/subscriptions/subscription-dead-letter' \
--header 'Content-Type: application/json' --data '{"topic": "projects/local-test/topics/dead-letter", "enableMessageOrdering": true, "enableExactlyOnceDelivery": true}'
我能够验证生产者和消费者是否正确连接在一起并按预期发送/接收消息。为了概念证明的目的,我让接收方法在收到消息时抛出一个新的 RuntimeException() 。发生这种情况时,我的应用程序日志显示
PubSubInboundChannelAdapter - 发送 Spring 消息 [4] 失败;消息自动取消。
5 次,这与我创建 subscription-task-reactor-fam-task 时定义的预期行为相符,但通过点击
轮询死信订阅POST http://localhost:8080/v1/projects/local-test/subscriptions/subscription-dead-letter:pull
导致超时且没有消息返回。订阅和主题都在那里,死信主题也在那里,并且似乎是在创建订阅时指定的。对死信主题的订阅是存在的,有效且可轮询,只是即使消息被拒绝,当我轮询死信主题时它们也不会出现。我看到其他问题以及有关确保服务帐户具有可用的订阅者和发布者角色的答案,但我不确定如何(如果有)将其转换为模拟器。知道我做错了什么吗?
目前此功能(死信队列主题过滤)尚不可用,请参阅此讨论。截至目前,过滤死信队列主题有一个正在进行的功能请求,您可以在请求线程上发表评论以进行跟进,但请注意,它没有确定何时可以授予此类请求。此外,您还可以提交您自己的功能请求,并针对您自己的用例更加具体。