首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rabbitmq死信队列不延迟消息

Rabbitmq死信队列不延迟消息
EN

Stack Overflow用户
提问于 2022-09-15 11:52:23
回答 1查看 28关注 0票数 0

我已经安排好了。如果他们失败了,我想在10秒后再试一次。但是,按照我设置的方式,消息不会延迟,它会立即返回队列。我想等10秒才向main_queue发送消息。

下面是我的密码。我用的是兔子红宝石。

代码语言:javascript
复制
connection = Bunny.new('url_for_rabbitmq', verify_peer: true)
connection.start
channel = connection.create_channel

# Creating 2 Exchanges (One Main exchange, one retry exchange)

exchange = channel.direct('main_exchange')
retry_exchange = channel.direct('retry_exchange')

# Creating 2 Queue (One Main queue, one retry queue)

queue = channel.queue('main_queue', durable: true, arguments: { 'x-dead-letter-exchange' => retry_exchange.name })
queue.bind(exchange, routing_key: 'foo')
queue.bind(retry_exchange, routing_key: 'foo') # This one is pushing message directly to main queue without waiting for 10 second.

retry_queue = channel.queue('retry_queue', durable: true, arguments: { 'x-message-ttl' => 10_1000, 'x-dead-letter-exchange' => retry_exchange.name })
retry_queue.bind(retry_exchange, routing_key: 'foo')

如果我更改这一行(retry_exchange改为exchange)

代码语言:javascript
复制
retry_queue = channel.queue('retry_queue', durable: true, arguments: { 'x-message-ttl' => 10_1000, 'x-dead-letter-exchange' => retry_exchange.name })

到这个

代码语言:javascript
复制
retry_queue = channel.queue('retry_queue', durable: true, arguments: { 'x-message-ttl' => 10_1000, 'x-dead-letter-exchange' => exchange.name })

那就成功了。但是消息来自main_exchange,但我希望消息来自retry_exchange。我怎样才能做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2022-09-16 06:51:21

我就是这样解决问题的

代码语言:javascript
复制
connection = Bunny.new('url_for_rabbitmq', verify_peer: true)
connection.start
channel = connection.create_channel

# Creating 2 Exchanges (One Main exchange, one retry exchange)

exchange = channel.direct('main_exchange')
retry_exchange = channel.direct('retry_exchange')

# Creating 2 Queue (One Main queue, one retry queue)

retry_queue = channel.queue('retry_queue', durable: true, arguments: { 'x-message-ttl' => 10_1000, 'x-dead-letter-exchange' => retry_exchange.name })
retry_queue.bind(retry_exchange, routing_key: 'foo')
retry_queue.bind(retry_exchange, routing_key: retry_queue.name)


queue = channel.queue('main_queue', durable: true, arguments: { 'x-dead-letter-exchange' => retry_exchange.name, 'x-dead-letter-routing-key' => retry_queue.name })
queue.bind(exchange, routing_key: 'foo')
queue.bind(exchange, routing_key: retry_queue.name)

基本上,我需要将它添加到主队列'x-dead-letter-routing-key' => retry_queue.name中。并从主队列queue.bind(retry_exchange, routing_key: 'foo')中删除一对不必要的绑定

现在消息进入主队列,如果失败,则转到重试队列。在重试队列之前,它将删除旧的路由密钥foo,并将其替换为新的路由密钥retry_queue.name。它在重试队列中停留10秒,然后再回到主队列进行重试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73730626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档