package rabbitmq import ( configYaml "common/configsYaml" "goutil/logUtilPlus" "strconv" ) // ConsumeData 消费mq数据 func ConsumeData(handler func(data string) error) { // 确保通道启用了 Publisher Confirms if err := RabbitMQChannel.Confirm(false); err != nil { logUtilPlus.ErrorLog("channel could not be put into confirm mode: %w", err) } //循环数据库数量 for _, index := range configYaml.GetDBNum() { rabbitMQName := configYaml.GetRabbitMQName() + ":" + strconv.Itoa(index) // 注册一个消费者 msgs, err := RabbitMQChannel.Consume( rabbitMQName, // 队列名称 "", // 消费者名称 false, // 是否自动确认 false, // 是否排他 false, // 是否本地 false, // 是否阻塞 nil, // 其他参数 ) if err != nil { logUtilPlus.ErrorLog("Failed to register a consumer,err:%s", err.Error()) } // 启动一个 goroutine 来处理消息 go func() { for d := range msgs { // 消息处理 if err = handler(string(d.Body)); err != nil { // 消息处理失败,记录错误日志 logUtilPlus.ErrorLog("Failed to handle message, err:%s", err.Error()) } // 消息处理完成后手动确认 if err := d.Ack(false); err != nil { logUtilPlus.ErrorLog("Failed to acknowledge message, err:%s", err.Error()) } } }() } }