Spring Cloud AWS(1.0.0.RC2)中SimpleMessageListenerContainer类的当前实现似乎在消息处理程序完成处理消息并且方法调用返回后自动删除消息。
在我们的应用程序中,我们需要能够处理消息并等待来自下游队列的异步确认,然后再从SQS上游队列中删除消息。像
这样的东西接收SQS消息 - >处理消息 - >将msg发布到RabbitMQ(线程在这里完成)
删除SQS msg< - 我们的应用< - RabbitMQ Msg成功Ack(异步)
当msg ack通过不同的线程异步返回时,我们需要选择在我们检查成功确认后手动删除SQS中的msg。
理想情况下,SimpleMessageListener应该可以配置它运行的模式(自动删除或手动删除)。
我们非常希望使用spring aws cloud lib(与我们自己推出)与SQS集成,因为它已经处理了监听器容器bean的生命周期管理。
如果上述建议的功能被认为是可行的,请告知我们,如果可行,请在何时实施和发布。
感谢。
答案 0 :(得分:2)
我们可以再添加一个标志(除了已经存在的 deleteMessageOnException 标志),即使成功处理,也可以完全禁用自动删除消息。我看到的问题是毒性消息不再处理,可能会炸毁队列。我为here创建了一个问题。
您的方法会遇到另一个问题。如果消息没有被足够快地删除(基于可见性超时),它将在您的处理程序方法中再次出现。
接收SQS msg1 - >处理msg1 - >将msg1发布到RabbitMQ(线程在这里完成)
接收SQS msg2 - >处理msg2 - >将msg2发布到RabbitMQ(线程在这里完成)
接收SQS msg1 - >处理msg1 - >将msg1发布到RabbitMQ msg1再次出现,因为它未被删除
删除SQS msg1< - 我们的应用< - RabbitMQ Msg1成功Ack(异步)
现在,非常丑陋的解决方法可能是在处理程序方法中抛出异常,并将 deleteMessageOnException 标志设置为 false 。因此,不会删除任何邮件,您可以获取收据句柄(使用 @Header 或 @Headers )以手动删除它们。
修改强>
现在问题已解决,可以使用@SqsListener
注释直接定义删除策略,并使用注入的Acknowledgment对象。请参阅this issue