您的位置:首页 > 编程语言 > Java开发

rabbitmq的延迟队列spring配置(单exchange,多queue)

2017-03-30 17:52 633 查看
<!-- 订单通知服务队列 -->
<!-- 创建rabbit ConnectionFactory,连接服务器 -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbitmq.host}" username="${rabbitmq.username}" password="${rabbitmq.password}"
port="${rabbitmq.port}" virtual-host="${rabbitmq.vhost}" />

<!-- 队列声明 -->
<rabbit:queue id="queue_TestNotify" name="queue_TestNotify" durable="true" auto-delete="false" exclusive="false">
<rabbit:queue-arguments>
<entry key="x-dead-letter-exchange" value="trade_direct"/>
<entry key="x-dead-letter-routing-key" value="routeKey_TradePayNotify_delay_15s"/>
</rabbit:queue-arguments>
</rabbit:queue>

<!-- 监听处理器 -->
<bean id="tradePayNotifyListener" class="test.prj.main.rabbit.TradePayNotifyListener" />

<!-- 监听器acknowledge=manual表示手工确认消息已处理(异常时可以不确认消息),auto表示自动确认(只要不抛出异常,消息就会被消费) -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual">
<rabbit:listener queues="queue_TestNotify" ref="tradePayNotifyListener" method="onMessage"/>
</rabbit:listener-container>

<!-- ################ 延迟队列生产者配置 ################ -->
<rabbit:admin connection-factory="connectionFactory" />
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="trade_direct" message-converter="jsonMessageConverter"/>

<rabbit:queue id="queue_TestNotify_delay_15s" name="queue_TestNotify_delay_15s" durable="true" auto-delete="false" exclusive="false">
<rabbit:queue-arguments>
<entry key="x-message-ttl" value="15000" value-type="java.lang.Long"/>
<entry key="x-dead-letter-exchange" value="trade_direct"/>
<entry key="x-dead-letter-routing-key" value="routeKey_TradePayNotify"/>
</rabbit:queue-arguments>
</rabbit:queue>

<!-- work exchange -->
<rabbit:direct-exchange name="trade_direct" durable="true" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="queue_TestNotify" key="routeKey_TradePayNotify"/>
<rabbit:binding queue="queue_TestNotify_delay_15s" key="routeKey_TradePayNotify_delay_15s"/>
</rabbit:bindings>
</rabbit:direct-exchange>


注意不同项目中(或者多个生产者如果都创建同一个exchange,queue时,queue,exchange相关配置应该是一样的),否则会报如下错误:

inequivalent arg 'x-dead-letter-routing-key' for queue

可以先把相关的exchange,queue删除,再重新运行程序即可。

问题:这种方式似乎无法实现像支付宝通知那样的,比如:30s通知一次,60s再通知一次,120s再通知一次,等等。

解决:queue_TestNotify 这个队列的配置,去掉x-dead相关配置,使用程序来分发到不同的queue中,例如queue_15s,queue_30s,queue_60s等等队列。这些所有的队列有dlx都指向queue_TestNotify
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: