使用的语言是go语言,框架beego ,废话不多说直接代码
使用的工具包是github.com/streadway/amqp
go get github.com/streadway/amqp
import "github.com/streadway/amqp"
使用的函数时amqp.Dail()
,直接将连接封装起来,因为每个模式生产者和消费者都要进行连接
func Connect() (*amqp.Connection, error) {
conn, err := amqp.Dial("amqp://用户名:密码@rabbitmqIp:5672/")
return conn, err
}
参数说明:Dail(“amqp://用户名:密码@rabbitmqIp:5672/”)
步骤:
创建连接 并且使用defer 关闭连接
创建channel通道并使用defer 关闭连接
创建队列,然后才能向队列发送消息 ,使用:channel.QueueDecclare()
发送消息 .使用:ch.Publish()
/**
* @Description: 简单模式和work模式生产者函数
* @param exchange 交换机名称 简单和work模式下exchange为空
* @param queueName 队列名称
* @param body 消息内容
* @return error 返回值
*/
func Publish(exchange string, queueName string, body string) error {
//连接
conn, err := Connect()
if err != nil {
return err
}
defer conn.Close()
//创建channel
ch, err := conn.Channel()
if err != nil {
return err
}
defer ch.Close()
//声明一个队列供我们发送,然后才能向队列发送消息
//第一个参数 队列名称 第二个参数 是否持久化 第三个参数 是否删除 第四个参数 是否唯一 第五个参数 是否等待 第六个其它参数
q, err := ch.QueueDeclare(queueName, true, false, false, false, nil)
if err != nil {
return err
}
//发送消息
//第一参数 交换机名称 ,第二个参数 队里名称 第三个参数 是否强制 第四个参数 立即执行 ,第五个 消息体
err = ch.Publish(exchange, q.Name, false, false,
amqp.Publishing{
DeliveryMode: amqp.Persistent, ContentType: "text/plain", Body: []byte(body)})
return err
}
步骤:
创建连接 并且使用defer 关闭连接
创建channel通道并使用defer 关闭连接
声明消费队列,并与生产者函数保持一致 ,使用:channel.QueueDeclare
做队列声明,因为消费者可能在生产者之前启动,所以要确保使用消息之前队列已经存在,使用:ch.Consume
接收消息
/**
* @Description: 简单模式和work模式消费者函数
* @param exchange
* @param queueName
* @param callback
*/
func ReceiveMsg(exchange string, queueName string, callback Callback) {
//先建立连接
conn, err := Connect()
if err != nil {
failOnError(err, "Failed to connect to RabbitMQ")
return
}
defer conn.Close()
//创建channel
ch, err := conn.Channel()
if err != nil {
failOnError(err, "Failed to open Channel")
return
}
defer ch.Close()
//声明消费队列,与发送端相匹配
//参数 第一个参数 队列名称,第二个参数 是否持久化 第三个参数 是否删除 第四个参数 是否独一 第五个参数 是否等待 第六个其他参数
q, err := ch.QueueDeclare(queueName, true, false, false, false, nil)
if err != nil {
failOnError(err, "Failed to create QueueDeclare")
return
}
// 做队列声明,因为消费者可能在生产者之前启动
//参数 第一个参数 队列名称,第二个参数 消费者 第三个参数 是否自动应答 第四个参数 是否独一 第五个参数 是否局部 第六个参数是否等待 第七个其他参数 nil
msgs, err := ch.Consume(q.Name, "", false, false, false, false, nil)
if err != nil {
failOnError(err, "Failed to register QueueDeclare")
return
}
//接收消息
forever := make(chan bool)
go func() {
for d := range msgs {
s := BytesToString(&(d.Body))
callback(*s)
_ = d.Ack(false) //如果ch.Consume第三个参数否自动应答为false,需要我们手动应答,添加此行代码,如果为true 不需要
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}
这里使用的是beego框架,直接通过路由来访问生产者
//简单模式和work工作模式, push方法
func (m *MqController) GetMq() {
go func() {
count := 0
for {
err := mq.Publish("", "fyouku_demo", "hello+"+strconv.Itoa(count))
fmt.Println(err)
count++
time.Sleep(1 * time.Second)
}
}()
m.Ctx.WriteString("HELLO")
}
新建个mq/work/main.go
文件
func main() {
mq.ReceiveMsg("","fyouku_demo",callback)
}
func callback(s string) {
fmt.Printf("Msg is :%s\n",s)
}
通过终端进入main.go;通过命令bee run
运行文件
进入rabittmq管理界面,就可以看到刚才运行的队列了