package RabbitMQ
import (
"fmt"
"github.com/streadway/amqp"
"log"
)
const MQURL = "amqp://imooc:imooc@127.0.0.1:5672/imooc"
type RabbitMQ struct {
conn *amqp.Connection
channel *amqp.Channel
QueueName string
Exchange string
Key string
Mqurl string
}
func NewRabbitMQ(queueName string,exchange string,key string)*RabbitMQ {
rabbitmq := &RabbitMQ{
QueueName: queueName,
Exchange: exchange,
Key: key,
Mqurl: MQURL,
}
var err error
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))
}
}
func NewRabbitMQSimple(queueName string)*RabbitMQ {
rabbitmq := NewRabbitMQ(queueName,"","")
return rabbitmq
}
func (r *RabbitMQ)PublishSimple(message string) {
_,err := r.channel.QueueDeclare(
r.QueueName,
false,
false,
false,
false,
nil,
)
if err != nil{
fmt.Println(err)
}
r.channel.Publish(
r.Exchange,
r.QueueName,
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(message),
},
)
}
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,
false,
false,
nil,
)
if err != nil{
fmt.Println(err)
}
forever := make(chan bool)
go func() {
for d := range msgs{
log.Printf("Received a message:%s",d.Body)
}
}()
log.Printf("[*] waiting for message,to exit")
<-forever
}
func NewRabbitMQPubSub(exchangeName string)*RabbitMQ {
rabbitmq := NewRabbitMQ("",exchangeName,"")
var err error
rabbitmq.conn,err = amqp.Dial(rabbitmq.Mqurl)
rabbitmq.failOnErr(err,"failed to connect rabbitmq!")
rabbitmq.channel,err = rabbitmq.conn.Channel()
rabbitmq.failOnErr(err,"failed to open a channel")
return rabbitmq
}
func (r *RabbitMQ)PublishPub(message string) {
err := r.channel.ExchangeDeclare(
r.Exchange,
"fanout",
true,
false,
false,
false,
nil,
)
r.failOnErr(err,"failed to declare an excha"+"nge")
err = r.channel.Publish(
r.Exchange,
"",
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(message),
},
)
}
func (r *RabbitMQ)RecieveSub() {
err := r.channel.ExchangeDeclare(
r.Exchange,
"fanout",
true,
false,
false,
false,
nil,
)
r.failOnErr(err,"failed to declare an exchange")
q,err := r.channel.QueueDeclare(
"",
false,
false,
true,
false,
nil,
)
r.failOnErr(err,"failed to declare a queue")
err = r.channel.QueueBind(
q.Name,
"",
r.Exchange,
false,
nil,
)
message,err := r.channel.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
forever := make(chan bool)
go func() {
for d := range message{
log.Printf("received a message:%s",d.Body)
}
}()
log.Printf("[*] waiting for message,to exit")
<-forever
}
func NewRabbitMQRouting(exchangeName string,routingKey string)*RabbitMQ {
rabbitmq := NewRabbitMQ("",exchangeName,routingKey)
var err error
rabbitmq.conn, err = amqp.Dial(rabbitmq.Mqurl)
rabbitmq.failOnErr(err,"failed to connect rabbitmq!")
rabbitmq.channel,err = rabbitmq.conn.Channel()
rabbitmq.failOnErr(err, "failed to open a channel")
return rabbitmq
}
func (r *RabbitMQ)PublishRouting(message string) {
err := r.channel.ExchangeDeclare(
r.Exchange,
"direct",
true,
false,
false,
false,
nil,
)
r.failOnErr(err,"failed to declare an exchange")
err = r.channel.Publish(
r.Exchange,
r.Key,
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(message),
},
)
r.failOnErr(err,"failed to publish message")
}
func (r *RabbitMQ)RecieveRouting() {
err := r.channel.ExchangeDeclare(
r.Exchange,
"direct",
true,
false,
false,
false,
nil,
)
r.failOnErr(err,"failed to declare an exchange")
q,err := r.channel.QueueDeclare(
"",
false,
false,
true,
false,
nil,
)
r.failOnErr(err,"failed to declare a queue")
err = r.channel.QueueBind(
q.Name,
r.Key,
r.Exchange,
false,
nil,
)
messages, err := r.channel.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
forever := make(chan bool)
go func() {
for d := range messages{
log.Printf("receive a message:%s",d.Body)
}
}()
fmt.Println("退出请按CTRL+C\n")
<-forever
}