2015-02-07 82 views
2

处理的消息后SQS消息手动删除春季云AWS(1.0.0.RC2)当前实现SimpleMessageListenerContainer一样类的似乎是消息处理程序处理完消息和方法调用返回后自动删除邮件。spring-cloud-aws。成功地

在我们的应用,我们需要能够处理的消息,并从上游SQS队列中删除该消息之前从下行队列等待异步确认。像

东西收到SQS味精 - >进程味精 - >发布味精的RabbitMQ(线程在这里完成)

删除SQS味精< - 我们的应用程序< - RabbitMQ的消息成功确认(异步)

由于msg ack通过不同的线程异步回来,一旦我们检查了成功ack,我们需要选择手动从SQS中删除msg。

理想情况下,SimpleMessageListener应该是可配置为哪个模式它在运行时(自动删除或手动删除)。

我们很愿意使用Spring的AWS云LIB(VS推出我们自己)与SQS集成,因为它已经负责监听器容器中的Bean的生命周期管理。

请让我知道,如果上述建议的功能被认为是可行的,如果是这样,当它可以实现和释放。

谢谢。

回答

2

我们可以添加一个标志(除了已有的deleteMessageOnException标志)以完全禁用消息的自动删除,即使成功处理。我看到的问题是毒讯不再处理,可能会炸毁队列。我为那个here创建了一个问题。

你的方法会遇到另一个问题。如果消息没有被足够快地删除(基于可见性超时),它将再次出现在你的处理程序方法中。

接收SQS MSG1 - >过程MSG1 - >发布MSG1到的RabbitMQ(线程这里完成)

接收SQS MSG2 - >过程MSG2 - >发布MSG2到的RabbitMQ(线程这里完成)

接收SQS MSG1 - >过程MSG1 - >发布MSG1到RabbitMQ的MSG1又来了,因为它没有删除

删除SQS MSG1 < - 我们的应用程序< - RabbitMQ的MSG1成功确认(异步)

一个非常丑陋的解决方法,现在可能是抛出一个异常,在你的处理方法和deleteMessageOnException标志设置为。因此,任何消息都将被删除,你可以得到收据手柄(与@Header@Headers)手动删除它们。

编辑

现在的问题是固定的,可以直接与@SqsListener注释定义删除策略,并使用注射确认对象。请参阅this issue的最新评论

+0

当自动删除功能被完全禁用时,应用程序有责任处理消息重复。我认为这是一个合理的权衡。通过这种方式,它为应用程序提供了对消息生命周期的更多控制。这同样适用于处理有毒消息。通过中毒消息,我的意思是如果JSON负载无效或内容损坏,应用程序应该有机会决定如何处理消息(删除或死信)。 – larryl 2015-02-11 00:59:13