RabbitMQ延迟消费
实现原理:主要是通过死信队列进行。
首次推送的队列不进行消费,直至过期(过期时间即为设置的队列过期时间),过期后投递到对应死信交换机,最终消费死信队列的消息 从而完成延迟消费
配置示例:
<!-- 死信交换机 及队列-->
<rabbit:direct-exchange name="test.declaretrustin.delay" declared-by="rabbitAdmin" auto-declare="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="test.declaretrustin.final" key="test.declaretrustin.final"></rabbit:binding><!--最终要消费的队列 -->
</rabbit:bindings>
</rabbit:direct-exchange>
<rabbit:queue name="test.declaretrustin.final" declared-by="rabbitAdmin" auto-declare="true" durable="true">
</rabbit:queue>
<!-- 正常交换机 及队列-->
<rabbit:direct-exchange name="test.declaretrustin.normal" declared-by="rabbitAdmin" auto-declare="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="test.declaretrustin.initial" key="test.declaretrustin.initial"></rabbit:binding><!-- 初始队列 -->
</rabbit:bindings>
</rabbit:direct-exchange>
<rabbit:queue name="test.declaretrustin.initial" declared-by="rabbitAdmin" auto-declare="true" durable="true">
<rabbit:queue-arguments>
<entry key="x-message-ttl" value-type="long" value="5000"/><!--毫秒为单位的消息过期时间 1000*5 = 5000 -->
<entry key="x-dead-letter-exchange" value="test.declaretrustin.delay"/><!-- 消息过期后投递到对应死信交换机 -->
<entry key="x-dead-letter-routing-key" value="test.declaretrustin.final"/><!-- 初始化的消息过期后路由到最终要消费的队列 -->
</rabbit:queue-arguments>
</rabbit:queue>
<!--消费监听 最总消费死信队列的消息 -->
<rabbit:listener-container connection-factory="connectionFactory" message-converter="messageConverter" concurrency="1" prefetch="1" acknowledge="auto">
<rabbit:listener ref="rustInEventListener" method="onReceive" admin="rabbitAdmin" queues="test.declaretrustin.final"/>
</rabbit:listener-container>