创建链接失败:AMQP scheme must be either 'amqp://' or 'amqps://'

来源:3-6 RabbitMQ工作模式---Simple模式(下)

慕神0174488

2021-09-26

package RabbitMQ

import (
“fmt”
github.com/streadway/amqp
“log”
)

//格式:amqp://账号:密码@地址:端口/vhost
const MQURL = “amqp://admin:admin@127.0.0.1:5672/imooc”

type RabbitMQ struct {
conn *amqp.Connection
channel *amqp.Channel
//队列名称
QueueName string
//交换机
Exchange string
//key
Key string
MqUrl string
}

//创建结构体基础实例
func NewRabbitMQ(queueName, exchange, key string) *RabbitMQ {
rabbitMQ := &RabbitMQ{QueueName: queueName, Exchange: exchange, Key: key}
var err error
//创建rabbitmq链接
rabbitMQ.conn, err = amqp.Dial(rabbitMQ.MqUrl)
rabbitMQ.failOnErr(err, “创建链接失败”)
rabbitMQ.channel, err = rabbitMQ.conn.Channel()
rabbitMQ.failOnErr(err, “获取channel失败”)
return rabbitMQ
}

//断开连接
func (r *RabbitMQ) Destory() {
r.channel.Close()
r.conn.Close()
}

//错误处理方法
func (r *RabbitMQ) failOnErr(err error, message string) {
if err != nil {
log.Fatalf("%s:%s", message, err)
panic(fmt.Sprintf("%s:%s", message, err))
}
}

//1。创建简单模式下的rabbitmq实例,simplemq
func NewRabbitMQSimple(queueName string) *RabbitMQ {
rabbitMQ := NewRabbitMQ(queueName, “”, “”)
return rabbitMQ
}

//2。生产消息
func (r *RabbitMQ) PublishSimple(message string) {
//1。申请队列。 队列不存在自动创建,队列存在则跳过创建
var err error
_,err = r.channel.QueueDeclare(
r.QueueName,
//是否持久化
false,
//是否自动删除
false,
//是否有排他性,true 其他用户不可访问
false,
//是否阻塞
false,
nil)
if err!=nil {
fmt.Println(err)
}
//发送消息到队列中
err = r.channel.Publish(
r.Exchange,
r.QueueName,
//如果是true,则会根据Exchange和routkey规则,如果找不到符合条件的队列,则返回给生产者
false,
//如果是true,如果队列并没有绑定消费者,则返回给生产者
false,
amqp.Publishing{
ContentType: “text/plain”,
Body: []byte(message),
})
}
//3。消费消息
func (r *RabbitMQ) ConsumeSimple(){
//1。申请队列。 队列不存在自动创建,队列存在则跳过创建
var err error
_,err = r.channel.QueueDeclare(
r.QueueName,
//是否持久化
false,
//是否自动删除
false,
//是否有排他性,true 其他用户不可访问
false,
//是否阻塞
false,
nil)
if err!=nil {
fmt.Println(err)
}
//接收消息
msgs,err:=r.channel.Consume(
r.QueueName,
//用来区分多个消费者
"",
//是否自动应答
true,
//是否排他,如果设置为true,表示不能将同个connection发送的消息传递给这个connection中的消费者
false,
//队列消费是否阻塞,
false,
false,
nil)
if err!=nil {
fmt.Println(err)
}
//消费消息
forever:=make(chan bool)
//启用协程处理消息
go func() {
for d:=range msgs{
//实现我们要处理的逻辑的代码
fmt.Println(d.Body)
}
}()
<-forever

}

写回答

1回答

Cap

2021-09-29

mq的链接地址检查下

0
0

全流程开发 GO实战电商网站高并发秒杀系统

运用架构设计与系统化思维,从容应对不同流量等级的“秒杀”场景

1476 学习 · 443 问题

查看课程