package main import ( "log" "testing" amqp "github.com/streadway/amqp" ) // failOnError 检查错误并记录致命错误 func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } // 测试函数 func Test001(t *testing.T) { // 连接到 RabbitMQ 服务器 conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") failOnError(err, "连接到 RabbitMQ 失败") defer conn.Close() // 打开一个通道 ch, err := conn.Channel() failOnError(err, "打开通道失败") defer ch.Close() // 声明一个队列 q, err := ch.QueueDeclare( "hello", // 队列名称 true, // 是否持久化 false, // 是否在使用后删除 false, // 是否排他 false, // 是否阻塞 nil, // 其他参数 ) failOnError(err, "声明队列失败") // 注册一个消费者 msgs, err := ch.Consume( q.Name, // 队列名称 "", // 消费者名称 true, // 是否自动确认 false, // 是否排他 false, // 是否本地 false, // 是否阻塞 nil, // 其他参数 ) failOnError(err, "注册消费者失败") // 创建一个无缓冲的通道,用于阻塞主 goroutine forever := make(chan bool) // 启动一个 goroutine 来处理消息 go func() { for d := range msgs { log.Printf("收到消息: %s", d.Body) } }() log.Printf(" [*] 等待消息。按 CTRL+C 退出") <-forever } func Test002(t *testing.T) { // 连接到 RabbitMQ 服务器 conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") failOnError(err, "连接到 RabbitMQ 失败") defer conn.Close() // 打开一个通道 ch, err := conn.Channel() failOnError(err, "打开通道失败") defer ch.Close() // 声明一个队列 q, err := ch.QueueDeclare( "hello", // 队列名称 true, // 是否持久化 false, // 是否在使用后删除 false, // 是否排他 false, // 是否阻塞 nil, // 其他参数 ) failOnError(err, "声明队列失败") // 定义要发送的消息内容 body := "Hello World!1111" // 发布消息到队列 err = ch.Publish( "", // 交换机名称 q.Name, // 路由键 false, // 是否强制 false, // 是否立即 amqp.Publishing{ ContentType: "text/plain", Body: []byte(body), }) failOnError(err, "发布消息失败") log.Printf(" [x] 发送 %s", body) }