首页 > 其他分享 >RabbitMQ - 使用amqp库连接RabbitMQ(实例使用)

RabbitMQ - 使用amqp库连接RabbitMQ(实例使用)

时间:2023-05-31 20:23:27浏览次数:42  
标签:ch false amqp err admin RabbitMQ failOnError 实例

1、发送端

步骤分解如下:
(1)建立连接
conn, err := amqp.Dial("amqp://admin:[email protected]:5672/")

(2)打开channel
这里的channel 是AMQP 里的概念,可以理解为 多路复用的一个tcp长连接。

(3)声明一个队列
q, err := ch.QueueDeclare( ... )

(4)创建消息
msg := amqp.Publishing{ ... }

(5)发布消息
err = ch.Publish( ... )

package main
 
import (
    "github.com/streadway/amqp"
    "log"
)
 
func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}
 
func main() {
    // 连接 RabbitMQ
    conn, err := amqp.Dial("amqp://admin:[email protected]:5672/")
    failOnError(err, "连接失败")
    defer conn.Close()
 
    // 建立一个 channel ( 其实就是TCP连接 )
    ch, err := conn.Channel()
    failOnError(err, "打开通道失败")
    defer ch.Close()
 
    // 创建一个名字叫 "hello" 的队列
    q, err := ch.QueueDeclare(
        "hello", // name
        false,   // durable
        false,   // delete when unused
        false,   // exclusive
        false,   // no-wait
        nil,     // arguments
    )
    failOnError(err, "创建队列失败")
 
    // 构建一个消息
    body := "Hello World!"
    msg := amqp.Publishing{
        ContentType: "text/plain",
        Body:        []byte(body),
    }
 
    // 构建一个生产者,将消息 放入队列
    err = ch.Publish(
        "",     // exchange
        q.Name, // routing key
        false,  // mandatory
        false,  // immediate
        msg)
    log.Printf(" [x] Sent %s", body)
    failOnError(err, "Failed to publish a message")
}
 

 

2、接收端

2.2 接收端
步骤分解如下:
(1)建立连接
conn, err := amqp.Dial("amqp://admin:[email protected]:5672/")

(2)打开channel
这里的channel 是AMQP 里的概念,可以理解为 多路复用的一个tcp长连接。

(3)声明一个队列
q, err := ch.QueueDeclare( ... )

(4)构建一个消费者
msgChan, err := ch.Consume( ... )

(5)不断的读取消息

for d := range msgChan {
log.Printf("收到消息: %s", d.Body)
}

package main
 
import (
    "github.com/streadway/amqp"
    "log"
)
 
func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}
 
func main() {
    // 连接 RabbitMQ
    conn, err := amqp.Dial("amqp://admin:[email protected]:5672/")
    failOnError(err, "连接失败")
    defer conn.Close()
 
    // 建立一个 channel ( 其实就是TCP连接 )
    ch, err := conn.Channel()
    failOnError(err, "打开通道失败")
    defer ch.Close()
 
    // 创建一个名字叫 "hello" 的队列
    q, err := ch.QueueDeclare(
        "hello", // name
        false,   // durable
        false,   // delete when unused
        false,   // exclusive
        false,   // no-wait
        nil,     // arguments
    )
    failOnError(err, "创建队列失败")
 
    // 开启一个 消费者
    // 返回值是 ch 类型
    msgChan, err := ch.Consume(
        q.Name, // queue
        "",     // consumer
        true,   // auto-ack
        false,  // exclusive
        false,  // no-local
        false,  // no-wait
        nil,    // args
    )
    failOnError(err, "注册消费者 ,失败")
 
    //帮助阻塞
    forever := make(chan bool)
 
    // 开启一个 go程
    go func() {
        for d := range msgChan {
            log.Printf("收到消息: %s", d.Body)
        }
    }()
 
    log.Printf(" 等待消息...")
    <-forever
}
 

3. 可能遇到的问题

遇到 “Reason: "username or password not allowed"”
缺少权限,可能账户密码错误,也可能使用了 guest 账户未处理远程连接。考虑新建一个高权限的用户。
新建账户的方法请参考我的另一篇文章。

遇到 “no access to this vhost”
为 admin 赋予权限,使之可以访问 vhost
下面的指令 为 admin 赋予权限,使得可以访问 vhost 名字为 / 的资源。

rabbitmqctl set_permissions -p / admin "." "." "."
说明:
/ 是个 vhost 资源名称
"." "." "." 标识权限的类型,和读写权限。

标签:ch,false,amqp,err,admin,RabbitMQ,failOnError,实例
From: https://www.cnblogs.com/beatle-go/p/17447215.html

相关文章

  • 网络Socket编程及实例
    1TCP和UDP介绍在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次。1.1 网络体系结构 协议:控制网络中信息的发送和接收。定义了通信实体之间交换报文的格式和次序,以及在报文传输或接收或其他事件所采取的动作。一般把网络的层次结构和每层所使用协议的集合称为网络......
  • RabbitMQ在Windows下设置服务启动
    1.管理员模式运行  cmd 2.进入RabbitMQ安装目录下的sbin目录   输入命令: cdrabbitMQ的sbin路径,进入sbin目录输入命令:rabbitmq-service.batinstall进入服务,开启rabbitMQ服务 ......
  • windows下安装多个Redis实例
     1.复制配置: redis.windows-service.conf为redis.windows-service-6380.conf2.更改配置: 如端口/密码等3.安装实例:cdC:\ProgramFiles\Redis&&redis-server.exe--service-installredis.windows-service-6380.conf--service-nameRedis6380--port63804.启动实......
  • go-RabbitMQ
    erlang安装编译依赖:yuminstallmakegccgcc-c++build-essentialopensslopenssl-develunixODBCunixODBC-develkernel-develm4ncurses-devel解压:tar-zxvf创建存放环境目录:mkdir/opt/rabbitMq/erlang进入erlang解压目录执行命令:./configure--prefix=/opt/rabbit......
  • VST实例(12) 列扩展和多行显示
    TreeOptions.AutoOptions如果包含了“toAutoSpanColumns”,且下一栏为空,则本栏被缩减的文本(即文本只显示部分,后面只显示…)会自动扩展显示在下一栏中。看图示例: 通常情况下,当单元格的宽度不能完全显示字符串内容时,字符串会被截取显示,截取之外的内容显示为“……”。事实上......
  • VST实例(7)拖拽(drag&drop)
    1、拖拽操作需要用到的单元和函数在讲拖拽操作之前先讲两个过程(procedure):MovetoprocedureMoveTo(Source:PVirtualNode;Target:PVirtualNode;Mode:TVTNodeAttachMode;ChildrenOnly:Boolean);overload;procedureMoveTo(Node:PVirtualNode;Tree:TBaseVirtualTree......
  • VST实例(8)编辑
    VST的单元格支持编辑,使用普通的编辑很简单,VST提供了一个编辑器,是一个继承自TCUSTOMEDIT的编辑器。TStringEditLink=class(TInterfacedObject,IVTEditLink);1、发出编辑请求向VST发出编辑请求,有以下三种方式:第一种方式是,VST可以在treeoptions里设置toEditable,可在鼠标放到......
  • vst实例(9)创建编辑器
    先上编辑器单元的代码:uniteditlink;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,VirtualTrees;typetcomboeditlink=class(TInterfacedObject,IVTEditLink)privateFedit:TComboBox;itemstrs:......
  • VST实例(10) hint(提示)
    VST也支持提示(hint)。毫无疑问,要让VST支持hint,首先肯定需要设置:SHOWHINT:=TRUE;其次,还应该设置hintmode。TVTHintMode=(hmDefault,hmHint,hmHintAndDefault,hmTooltip);hmDefault :显示控件的hint,即VST的hint。hmHint :显示程序返回的提示。hmHintAndDefa......
  • 【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例
    全文链接:http://tecdat.cn/?p=32604原文出处:拓端数据部落公众号分析师:BaileyZheng和Lijie Zhang即使是同一种植物,由于生长的地理环境的不同,它们的特征会有所差异。例如鸢尾花,可分为山鸢尾、杂色鸢尾、维吉尼亚鸢尾。假设此时您得到了一朵鸢尾花,如何判断它属于哪一类呢?支......