package producer import ( "SeckillDesign/constant" "SeckillDesign/utitl" "fmt" "github.com/streadway/amqp" ) func DelayProducer(message string){ //TODO 他这个不需要你传入什么 直接生成一个链接 //就是获取这个连接呀 conn:=utitl.NewRabbitMQ().Conn defer conn.Close() mqCh:=utitl.NewRabbitMQ().Ch defer mqCh.Close() var err error _,err =mqCh.QueueDeclare(constant.NormalQueue,true,false,false,false,amqp.Table{ "x-message-ttl":20000,//todo 你这个是声明队列的过期时间还是消息的过期时间 这个时间是可以改的吧 "x-dead-letter-exchange":constant.DeadExchange,//声明死信交换机 "x-dead-letter-routing-key":constant.DeadRoutingKey,//声明死信队列 ----- if err != nil{ fmt.Println("declare NormalQueue error,err=",err) return } err =mqCh.ExchangeDeclare(constant.NormalExchange,amqp.ExchangeDirect,true,false,false,false,nil) if err != nil{ fmt.Println("NormalExchange exchange declare false,err=",err) return } err =mqCh.QueueBind(constant.NormalQueue,constant.NormalRoutingKey,constant.NormalExchange,false,nil) if err != nil{ fmt.Println("normal:队列、交换机、routing-key 绑定失败",err) return } // 声明死信队列 _,err =mqCh.QueueDeclare(constant.DeadQueue,true, false, false, false, nil) if err !=nil{ fmt.Println("deadQueue声明失败,err=",err) return } err =mqCh.ExchangeDeclare(constant.DeadExchange,amqp.ExchangeDirect,true,false,false,false,nil) if err !=nil{ fmt.Println("deadExchange声明失败,err=",err) return } 就是你这里没有绑定 死信队列 和 死信交换机 导致出现过了15s之后 那个 死信队列中没有出现 消息 err = mqCh.QueueBind(constant.DeadQueue, constant.DeadRoutingKey, constant.DeadExchange, false, nil) if err != nil{ fmt.Println("死信交换机和死信队列绑定失败,err=",err) return } err = mqCh.Publish(constant.NormalExchange,constant.NormalRoutingKey,false,false,amqp.Publishing{ContentType: "text/plain", Body:[]byte(message)}) if err !=nil{ fmt.Println("消息发布失败,err=",err) return } }
还有一个问题 就是出现 错误inequivalent arg 'x-dead-letter-exchange' for queue 'igSmev3-ListenerQueue' in vhost '/': received none but current is the value 'igSmev3Dlx' of type 'longstr'
解决方案 把那个normal queue给删除