撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>
本文永久更新地址:https://my.oschina.net/bysu/blog/3092864
推荐一款免费的自购省钱,分享赚钱的平台——赚赚熊,感兴趣的,特别是家里有婆娘专职带娃的,请看文末。
0.先安装配置好RabbitMQ,参考《window10下RabbitMQ的安装及入门使用》
1.执行go get github.com/streadway/amqp,安装amqp包
一.RabbitMQ的simple模式:生产者生成消息放到队列中,消费者从队列中获取消息进行消费
1.go实现代码如下:
package RabbitMQ
import (
"fmt"
"github.com/streadway/amqp"
"log"
)
//url格式 amqp://账户;密码@RabbitMQ服务器地址:端口号/vhost
const MQURL = "amqp://by_name_root:byroot@127.0.0.1:5672/vir_root"
type RabbitMQ struct{
conn *amqp.Connection
channel *amqp.Channel
//队列名词
QueueName string
//交换机
Exchange string
//key
Key string
//连接信息
Mqurl string
}
//创建RabbitMQ结构体实例
func NewRabbitMQ(queueName,exchange,key string) *RabbitMQ{
rabbitmq := &RabbitMQ{QueueName:queueName,Exchange:exchange,Key:key,Mqurl:MQURL}
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
}
//断开connection和channel
func (r *RabbitMQ) Destory(){
r.channel.Close()
r.conn.Close()
}
func (r *RabbitMQ) FailOnErr(err error,message string){
if err != nil {
log.Fatal("%s:%s",message,err)
panic(fmt.Sprint("%s:%s",message,err))
}
}
//创建简单模式Step:1.创建简单模式下RabbitMQ实例
func NewRabbitMQSimple(queueName string) *RabbitMQ{
return NewRabbitMQ(queueName,"","")
}
//简单模式Step:2.简单模式下生产代码
func (r *RabbitMQ) PublishSimple(message string){
//1.申请队列,如果队列不存在会自动创建,如果存在则跳过创建
//保证队列存在,消息能发送到队列中
_,err := r.channel.QueueDeclare(r.QueueName,
//是否持久化
false,
//是否为自动删除
false,
//是否具有排他性
false,
//是否阻塞
false,
//额外属性
nil)
if err != nil {
fmt.Println(err)
}
//2.发送消息到队列中
r.channel.Publish(
r.Exchange,
r.QueueName,
//如果为true,根据exhange类型和routkey规则,如果无法找到符合条件的队列,那么会把发送的消息返回给消息发送者
false,
//如果为true,当exchan发送消息到队列后发现队列上没有绑定消费者,则会把消息返回给发送者
false,
amqp.Publishing{
ContentType:"text/plain",
Body:[]byte(message),
})
}
func (r *RabbitMQ) ConsumeSimple(){
//1.申请队列,如果队列不存在会自动创建,如果存在则跳过创建
//保证队列存在,消息能发送到队列中
_,err := r.channel.QueueDeclare(r.QueueName,
//是否持久化
false,
//是否为自动删除
false,
//是否具有排他性
false,
//是否阻塞
false,
//额外属性
nil)
if err != nil {
fmt.Println(err)
}
//2.接受消息
msgs,err := r.channel.Consume(
r.QueueName,
//用来区别多个消费者
"",
//是否自动应答
true,
//是否具有排他性
false,
//如果设置为true,表示不能将同一个connection中发送的消息传递给这个connection中的消费者
false,
//队列消费是否阻塞
false,
nil)
if err != nil {