package rabbitmq
import (
"encoding/json"
"github.com/streadway/amqp"
"log"
)
type RabbitMQ struct {
conn *amqp.Connection //连接
channel *amqp.Channel //管道
QueueName string //队列名称
Exchange string //交换机
Key string //key Simple模式 几乎用不到
MqUrl string //连接信息
}
// NewRabbitMQ 创建RabbitMQ结构体实例
/*
new只需要最基础的连接上rabbitmq服务器即可,也就是创建好客户端
队列和exchange并非是客户行为,应该为管理员配置好,当然我们自己也可以通过代码设置,但是没必要放在new中
*/
func NewRabbitMQ(url string) *RabbitMQ {
rabbitmq := &RabbitMQ{MqUrl: url}
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
}
// ExchangeDeclare 创建exchange 这个和创建的rabbitmq没有关系,别的程序创建的exchange,该程序也能使用
/*
创建exchange 根据rabbitmq的原理可以知道,exchange和客户端没多大关系,哪一个客户端都可以绑定exchange
形参:exchange表示声明的ex的名字,以后绑定ex的时候需要用到
kind表示声明的ex的类型
*/
func (r *RabbitMQ) ExchangeDeclare(exchange, kind string) {
r.Exchange = exchange
err := r.channel.ExchangeDeclare(
r.Exchange,
kind,
false,
false,
false,
false,
nil)
r.failOnErr(err, "创建exchange失败")
}
// QueueDeclare 创建Queue
/*
创建Queue 同ex的道理一样,创建的queue,不一定是非得这个客户端自己使用,
所以,在接收的时候,我们需要选择需要接收的队列
形参:queueName表示声明队列的名称,以后读取数据的时候,需要依靠队列名字来绑定
*/
func (r *RabbitMQ) QueueDeclare(queueName string) {
r.QueueName = queueName
_, err := r.channel.QueueDeclare(
queueName,
false,
false,
false,
false,
nil)
r.failOnErr(err, "创建queue失败")
}
// Bind
/*
绑定:在接收消息之前,先要绑定队列以及ex
r.QueueName, //绑定要接收的队列
r.Key, //给队列赋bingKey
ex, //队列要从哪个ex接收数据
*/
func (r *RabbitMQ) Bind(queue, key, ex string) {
err := r.channel.QueueBind(
queue,
key,
ex,
false,
nil)
r.failOnErr(err, "绑定exchange失败")
}
// Send
/*
发送,exchange是发送到哪一个ex上,key是routing key
如果在simple或者广播等模式下,exchange,key传入空即可
*/
func (r *RabbitMQ) Send(exchange, key string, body interface{}) {
str, err := json.Marshal(body)
r.failOnErr(err, "send json 失败")
err = r.channel.Publish(
exchange,
key,
false,
false,
amqp.Publishing{
ReplyTo: r.QueueName,
Body: []byte(str),
},
)
r.failOnErr(err, "send 失败")
}
// Consume
/*
从哪一个队列中读取数据
*/
func (r *RabbitMQ) Consume(queue string) <-chan amqp.Delivery {
c, err := r.channel.Consume(
queue,
"",
true,
false,
false,
false,
nil)
r.failOnErr(err, "consume 失败")
return c
}
func (r *RabbitMQ) Destroy() {
r.channel.Close()
r.conn.Close()
}
func (r *RabbitMQ) failOnErr(err error, message string) {
if err != nil {
log.Fatalf("%s:%s", message, err)
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Go语言版本rabbitmq消息队列库:simple、worker、Fanout 模型、Direct 模型、Topic模型。 RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。 RabbitMQ是一个消息代理:它接受和转发消息。 你可以把它想象成一个邮局:当你把邮件放在邮箱里时,你可以确定邮差先生最终会把邮件发送给你的收件人。 在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员。 RabbitMQ与邮局的主要区别是它不处理纸张,而是接受,存储和转发数据消息的二进制数据块。
资源详情
资源评论
资源推荐
收起资源包目录
rabbitmq.7z (24个子文件)
rabbitmq
Topic
send
send.go 458B
img.png 24KB
recv
recv.go 697B
rabbitmq.go 3KB
worker
send
send.go 269B
img.png 66KB
recv
recv.go 607B
Direct
send
send.go 384B
img.png 27KB
recv
recv.go 689B
simple
send
send.go 440B
img.png 15KB
recv
recv.go 397B
.idea
deployment.xml 969B
modules.xml 275B
workspace.xml 6KB
.gitignore 190B
inspectionProfiles
Project_Default.xml 1KB
rabbitmq.iml 330B
go.sum 169B
Publish_Subscribe
send
send.go 304B
img.png 14KB
recv
recv.go 640B
go.mod 67B
共 24 条
- 1
秋山刀名鱼丶
- 粉丝: 8899
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Windows系统下安装与配置Neo4j的步骤
- 基于matlab实现潮流计算和最优潮流计算的程序1,对毕业设计有一定用处.rar
- 基于大数据学习资源推荐系统的设计与实现(部署视频)-kaic.mp4
- 哈工大形式语言和自动机2022期末含答案
- Windows系统下安装与配置Neo4j的步骤
- 哈希算法(Hash Algorithm)是一种将任意长度的二进制数据映射为较短的、固定长度的二进制值的函数.txt
- Windows系统下安装与配置Neo4j的步骤
- 在二叉树或更复杂的树形结构中,先序输出叶结点.txt
- 列出所有祖先结点的概念通常与树形结构或图论中的节点相关.txt
- 基于matlab实现潮流计算程序,MATLAB潮流计算程序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0