我假设您知道 RabbitMQ 中的 Dead Letter Exchange (DLX) 是什么。如果您不知道,那么您应该阅读文档。简而言之,如果你的消息由于某种原因没有被消费,它就会被放到另一个队列中进行调查,如此循环。请确保死信交换和队列是在其他人之前声明的,否则消息将被默默地丢弃。
设置
我假设你已经有一个工作正常的消费者应用程序。让我们给它添加一个死信交换和队列:
# The current properties
ExchangeType: direct
ExchangeName: user
RoutingKey: create
QueueName: user_create
# New DLX properties
ExchangeType: fanout
ExchangeName: user_dlx
QueueName: user_create_dlx
新的DLX声明
不管其他的是什么,保持交换类型为fanout :
if err := channel.ExchangeDeclare(
"user_dlx",
"fanout",
true,
false,
false,
false,
nil,
); err != nil {
return err
}
if _, err := channel.QueueDeclare(
"user_create_dlx",
true,
false,
false,
false,
nil,
); err != nil {
return err
}
if err := channel.QueueBind(
"user_create_dlx",
"",
"user_dlx",
false,
nil,
); err != nil {
return err
}
修改内容
只是在配置中添加amqp.Table{"x-dead-letter-exchange": "user_dlx"}, 。这就到了你现有的队列:
if _, err := channel.QueueDeclare(
"user_create",
true,
false,
false,
false,
amqp.Table{"x-dead-letter-exchange": "user_dlx"},
); err != nil {
return err
}
测试
如果你在消费者中使用下面的代码,它将把消息从原来的队列中取出并放入DLX队列:
message.Nack(false, false)