Go语言封装RabbitMq操作
发送端封装
1、建立发送端结构体
type SendRabbitMQ struct {
conn *amqp.Connection
ch *amqp.Channel
q amqp.Queue
}
2、通过rabbitmq的地址和通道名称建立SendRabbitMQ对象
地址:amqp://guest:guest@localhost:5672/
通道名称: 任意值
func NewSendRabbitMQ(url string,queuename string) *SendRabbitMQ{
mysend := new(SendRabbitMQ)
var err error
mysend.conn, err = amqp.Dial(url)
cu.FailOnError(err, "Failed to connect to RabbitMQ")
mysend.ch, err = mysend.conn.Channel()
cu.FailOnError(err, "Failed to open a channel")
mysend.q, err = mysend.ch.QueueDeclare(
queuename, // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
cu.FailOnError(err, "Failed to declare a queue")
return mysend
}
3、发送字符串或其他数据
func (sr *SendRabbitMQ) SendData(Data string){
var err error
err = sr.ch.Publish(
"", // exchange
sr.q.Name, // routing key
false, // mandatory
false,
amqp.Publishing{
DeliveryMode: amqp.Persistent,
ContentType: "text/plain",
Body: []byte(Data),
})
cu.FailOnError(err, "Failed to publish a message")
log.Printf(" [x] Sent %s", Data)
}
4、关闭连接
func (sr *SendRabbitMQ) Close(){
sr.ch.Close()
sr.conn.Close()
}
接收端封装
1、建立接收端结构体
type ReceiveRabbitMQ struct {
conn *amqp.Connection
ch *amqp.Channel
q amqp.Queue
msgchan <-chan amqp.Delivery
}
2、通过rabbitmq的地址和通道名称建立ReceiveRabbitMQ对象
地址:amqp://guest:guest@localhost:5672/
通道名称: 任意值
func NewReceiveRabbitMQ(url string,queuename string) *ReceiveRabbitMQ{
myreceive := new(ReceiveRabbitMQ)
var err error
myreceive.conn, err = amqp.Dial(url)
cu.FailOnError(err, "Failed to connect to RabbitMQ")
myreceive.ch, err = myreceive.conn.Channel()
cu.FailOnError(err, "Failed to open a channel")
myreceive.q, err = myreceive.ch.QueueDeclare(
queuename, // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
cu.FailOnError(err, "Failed to declare a queue")
err = myreceive.ch.Qos(
1, // prefetch count
0, // prefetch size
false, // global
)
cu.FailOnError(err, "Failed to set QoS")
myreceive.msgchan, err = myreceive.ch.Consume(
myreceive.q.Name, // queue
"", // consumer
false, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
cu.FailOnError(err, "Failed to register a consumer")
return myreceive
}
3、接收字符串或其他数据
func (rr *ReceiveRabbitMQ)ReceiveData(ServerMsg func(msg string)){
forever := make(chan bool)
go func() {
for d := range rr.msgchan {
ServerMsg(fmt.Sprintf("%s",d.Body))
d.Ack(false)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}
4、关闭连接
func (rr *ReceiveRabbitMQ)Close(){
rr.ch.Close()
rr.conn.Close()
}
附加
封装需要提前引入包
“github.com/streadway/amqp”
关于rabbitmq其他用法关注github