1. 需要“消息延迟”功能
这对我们来说是很重要的业务需求。当顾客订了一个服务,首先我们会发送描述相信指令的短信,然后我们会在两分钟后发送第二条描述详情的短信,而不是两条一起发送。我们希望通过这样,留给用户阅读的时间(每次间隔2分钟),然后把他们放入处理递交的队列中。可是用现在的设计,在递交到RabbitMQ的时候,设置延迟是不可能的。因为开发者把RabbitMQ设计成立刻发送消息,而不是延迟后再发送。
我本可以使用Java SDK内建的“DelayQueue”,然后把消息递交到RabbitMQ,但是那样的话就会违背稳定应,不那样的话,就只能自己重新发明轮子了。
2. 持久队列的无用字母队列(DLQ)
DLQ是一种比较次要的方法,用来存储因为某些错误而无法被处理的消息。Spring-amqp提供了两种方式来把消息返回到RabbitMQ/DLQ中。
(a)抛出AmqpRejectAndDontRequeueException,这会把消息存储在DLQ中。
(b)把org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer’属性的defaultRequeueRejected设置为false。
设置例子
<rabbit:queue id="smsGatewayQueue" durable="true" auto-delete="false" exclusive="false" name="SmsGatewayQueue"> <rabbit:queue-arguments> <entry key="x-dead-letter-exchange" value="messagingExchange.DLQ" /> </rabbit:queue-arguments> </rabbit:queue>
我故意引起错误来测试DLQ。
但是我没有在DLQ中看到或者接受到任何消息。这没法找出那些消息到底怎么了。
在一系列的失败之后,我决定使用Amazon SQS(简单任务队列)。它提供了我需要的延迟功能。但这有个缺陷,我不得不使用轮训的方法来检查新消息,然后自己实现逻辑部分,以免从SQS中复制消息。
我将在以后让你知道我使用SQS的结果。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务