我已经安排好了。如果他们失败了,我想在10秒后再试一次。但是,按照我设置的方式,消息不会延迟,它会立即返回队列。我想等10秒才向main_queue发送消息。
下面是我的密码。我用的是兔子红宝石。
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)
retry_queue = channel.queue('retry_queue', durable: true, arguments: { 'x-message-ttl' => 10_1000, 'x-dead-letter-exchange' => retry_exchange.name })到这个
retry_queue = channel.queue('retry_queue', durable: true, arguments: { 'x-message-ttl' => 10_1000, 'x-dead-letter-exchange' => exchange.name })那就成功了。但是消息来自main_exchange,但我希望消息来自retry_exchange。我怎样才能做到这一点。
发布于 2022-09-16 06:51:21
我就是这样解决问题的
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秒,然后再回到主队列进行重试。
https://stackoverflow.com/questions/73730626
复制相似问题