首页 > 其他分享 >Go 实现Rabbitmq 简单模式

Go 实现Rabbitmq 简单模式

时间:2023-01-28 17:45:18浏览次数:34  
标签:Rabbitmq false string err 队列 rabbitmq RabbitMQ 模式 Go

 

 

 

rabbitmq.go文件代码如下

package RabbitMQ

import (
"fmt"
"github.com/streadway/amqp"
"log"
)

const MQURL = "amqp://lyc:[email protected]:5672/imooc"

type RabbitMQ struct {
conn *amqp.Connection
channel *amqp.Channel
//队列名称
QueueName string
//交换机
Exchange string
//key
Key string
//连接信息
Mqurl string
}

// NewRabbitMQ 创建结构体实例
func NewRabbitMQ(queueName string, exchange string, 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.failOnError(err, "创建连接错误")
rabbitmq.channel, err = rabbitmq.conn.Channel()
rabbitmq.failOnError(err, "获取Channel失败")
return rabbitmq
}

// Destory 断开channel和Connection
func (r *RabbitMQ) Destory() {
r.channel.Close()
r.conn.Close()
}

// failOnError 错误处理函数
func (r *RabbitMQ) failOnError(err error, message string) {
if err != nil {
log.Fatalf("%s:%s", message, err)
panic(fmt.Sprintf("%s:%s", message, err))
}
}

// NewRabbitMQSimple 创建简单模式下RabbitMQ实例
func NewRabbitMQSimple(queueName string) *RabbitMQ {
return NewRabbitMQ(queueName, "", "")
}

//PublishSimple 2简单模式Step:简单模式下生产代码
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,会根据exchange和routkey规则,如果无法以找到符合条件的
//条件的人列那么会把发送的消息返回给发送者
false,
//如果为true,当exchange发送消息到队列后发现队列上没有绑定消费者,则
//会把消息发还给发送者
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)
}
//接受消息
msgs, err := r.channel.Consume(
r.QueueName,
//用来区分多个消费者
"",
//是否自动应答
true,
//是否具有排他性
false,
//如果设置为true,表示不能将同一个connection中发送的消息传递给
//这个的connect消费者
false,
//队列是否阻塞
false,
nil,
)
if err != nil {
fmt.Println(err)
}
forever := make(chan bool)
//启用协程处理消息
go func() {
for d := range msgs {
//实现我们要处理的逻辑函数
log.Printf("Receive a massage:%s", d.Body)
}
}()
log.Printf("[*] waiting for message, To exit press CTRL+C")
<-forever
}

服务端代码:

  

package main

import (
"fmt"
"go-rabbitmq/RabbitMQ"
)

func main() {
rabbitmq := RabbitMQ.NewRabbitMQSimple("imoocSimple")
rabbitmq.PublishSimple("hello imooc!")
fmt.Println("发送成功!")
}
客户端代码:
package main

import "go-rabbitmq/RabbitMQ"

func main() {
rabbitmq := RabbitMQ.NewRabbitMQSimple("imoocSimple")
rabbitmq.ConsumeSimple()
}

标签:Rabbitmq,false,string,err,队列,rabbitmq,RabbitMQ,模式,Go
From: https://www.cnblogs.com/lisus2000/p/17070971.html

相关文章

  • Go mod 各类问题及解决办法
    [going@VM-24-3-centosserver]$gorunmain.gomain.go:9:2:norequiredmoduleprovidespackagegithub.com/grpc-demo/helloworld;toaddit:gogetgith......
  • 【godis】skiplist
    skiplist前言:在看代码时看到ZSKIPLIST_MAXLEVEL=32,当时并不了解ZSKIPLIST_P的作用,想着用2分法不应该层数是64吗?书上和他人的代码都是基于5.0的(5.0上是64),于......
  • 12--go mod和go vendor的区别 | 青训营笔记
    这是我参与「第五届青训营」伴学笔记创作活动的第12天背景在家安装的环境可能路径和环境变量配的有些问题,导致项目import的包全部标红,gomodtidy显示导入包不在路径,......
  • 【LOLHunter】【教程】云顶模式挂机教程
    官方一群:523361798注意事项:1.脚本云顶设置内的战场阵容和补位阵容都需要选择,否则无法正常使用。2.建议使用默认棋盘3.请不要调整棋盘的缩放(默认视野最大)战场阵......
  • WinForm DevExpress Mvvm 模式介绍
    原文目录WinFormsMVVM|WinFormsControls|DevExpressDocumentation翻译目录(40条消息)【DevExpressMVVM】中文翻译系列.文章目录_hbwhypw的博客-CSDN博客_mvvm的......
  • Mongodb多租户功能实现
    importcom.mongodb.client.MongoClient;importcom.mongodb.client.MongoDatabase;importlombok.extern.slf4j.Slf4j;importorg.springframework.data.mongodb.core......
  • 设计小白怎样设计logo?-优漫动游
    你是否有的时候想设计一个logo,却无从下手,设计小白怎样设计logo?很多同学觉得做卡通的LOGO很难,没有基础的学员根本不知道从何做起,如今的logo不简简单单是个标志了,他更是一个......
  • Go-23 传统方法统计1-62000之间的素数有哪些
    packagemainimport( "fmt" "time")//需求:统计1-62000之间的素数有哪些funcmain(){ start:=time.Now().Unix() fornum:=1;num<=62000;num++{ ......
  • 开启严格模式
    1.为整个脚本或函数开启严格模式 2.严格模式需要注意什么      ......
  • Go-24 golang命令行初始
    packagemainimport( "flag" "fmt" "os")//golang命令行初识;可以后面多多了解一下强大的命令行工具cobra//cobra工具推荐了解的地址:https://blog.csdn.net/qq......