1、url格式:amqp://帐号:密码@服务器地址:端口号/vhost
const MQURL = "amqp://zzl:[email protected]:5672/zzl"
2、定义RabbitMQ结构体
type RabbitMQ struct {
conn *amqp.Connection
channel *amqp.Channel
//队列名称
QueueName string
//交换机
Exchange string
//Key
Key string
//Info
Mqurl string
}
3、定义实例化方法以及断开方法
func NewRabbitMQ(QueueName string, Exchange string, Key string) *RabbitMQ {
return &RabbitMQ{
QueueName: QueueName,
Exchange: Exchange,
Key: Key,
Mqurl: MQURL,
}
}
func (r *RabbitMQ) Destroy() {
r.conn.Close()
r.channel.Close()
}
4、定义错误处理方法
func (r *RabbitMQ) FailOnErr(err error, message string) {
if err != nil {
log.Fatalf("%s:%s", message, err)
panic(fmt.Sprintf("%s:%s", message, err))
}
}
5、创建simple模式下的RabbitMQ
func NewRabbitMQSimple(queueName string) *RabbitMQ {
var err error
rabbitmq := NewRabbitMQ(queueName, "", "")
//exchange处为空 => 使用默认交换机(direct), key处为空 => 无key
rabbitmq.conn, err = amqp.Dial(rabbitmq.Mqurl)
rabbitmq.FailOnErr(err, "Failed to connect to RabbitMQ!")
rabbitmq.channel, err = rabbitmq.conn.Channel()
rabbitmq.FailOnErr(err, "Failed to connect to RabbitMQ!")
return rabbitmq
}
6、生产并发送消息
func (r *RabbitMQ) PublishSimple(message string) {
//若不存在队列则自动创建
_, err := r.channel.QueueDeclare(
r.QueueName,
//是否持久化
false,
//是否自动删除
false,
//是否具有排他性
false,
//是否阻塞
false,
//额外参数
nil,
)
if err != nil {
log.Fatalf("%s:%s", message, err)
panic(fmt.Sprintf("%s:%s", message, err))
}
//发送消息到队列
r.channel.Publish(
r.Exchange,
r.QueueName,
//如果为true,当无法找到符合条件的队列时将把消息自动返还
false,
//如果为true, 当队列上没有绑定消费者时将把消息自动返还。
false,
amqp.Publishing{
ContentType:"text/plain",
Body:[]byte(message),
},
)
}
7、消费消息
func (r *RabbitMQ) ConsumeSimple() {
_, err := r.channel.QueueDeclare(
r.QueueName,
//是否持久化
false,
//是否自动删除
false,
//是否具有排他性
false,
//是否阻塞
false,
//额外参数
nil,
)
if err != nil {
fmt.Println(err)
}
msgs, err := r.channel.Consume(
r.QueueName,
//用来区分多个消费者
"",
//是否自动应答
true,
//是否具有排他性
false,
//若设置为true则无法将消息传递给同一个connection中的其它消费者
false,
//是否阻塞
false,
nil,
)
if err != nil {
fmt.Println(err)
}
forever := make(chan bool)
//处理消息
go func() {
for msg := range msgs {
//TODO:处理消息
log.Printf("Received a message : %s", msg.Body)
fmt.Println(msg.Body)
}
}()
log.Printf("[#]Waiting for messages, to exit press CTRL + C")
<- forever
}
8、实例化测试消息发送与接收
管理界面队列出现波峰,控制台打印成功,说明成功生产并接受消息。
Simple模式生产消费测试成功。