Rabbitmq 搭建使用案例 [附源码]

news2024/11/20 8:46:03

Rabbitmq 搭建使用案例

文章目录

    • RabbitMQ搭建
      • docker
    • 代码
      • golang
        • 生产者
        • 消费者
    • 可视化
      • 消费进度

RabbitMQ搭建

docker

docker run -d --hostname rabbitmq --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_MANAGEMENT_PLUGIN=rabbitmq_management_agent -p 15672:15672 -p 5672:5672 rabbitmq:management

代码

golang

生产者
package main

import (
	"flag"
	"fmt"
	amqp "github.com/rabbitmq/amqp091-go"
	"log"
	"strconv"
	"time"
)

func main() {
	var url = flag.String("url", "amqp://admin:admin@localhost:5672/my_vhost", "RabbitMQ server URL")
	var exchange = flag.String("exchange", "logs", "Exchange name")
	var key = flag.String("key", "log", "Routing key")

	flag.Parse()

	// 连接到RabbitMQ服务器
	conn, err := amqp.Dial(*url)
	if err != nil {
		log.Fatalf("Failed to connect to RabbitMQ: %v", err)
	}
	defer conn.Close()

	// 创建一个通道
	ch, err := conn.Channel()
	if err != nil {
		log.Fatalf("Failed to open a channel: %v", err)
	}
	defer ch.Close()

	// 声明一个交换机
	err = ch.ExchangeDeclare(
		*exchange, // name: 交换机名称
		"fanout",  // kind: 交换机类型
		true,      // durable: 是否持久化
		false,     // autoDelete: 没有队列绑定时是否自动删除
		false,     // internal: 是否是内部交换机
		false,     // noWait: 是否需要等待服务器响应
		nil,       // args: 其他参数
	)
	if err != nil {
		log.Fatalf("Failed to declare an exchange: %v", err)
	}

	// 发送消息
	body := "Hello World!" + fmt.Sprintf(time.Now().String())

	for i := 0; i < 20; i++ {
		body = strconv.Itoa(i) + body
		err = ch.Publish(
			*exchange, // 交换机名称
			*key,      // 路由键
			false,     // 强制发布
			false,     // 立即发布
			amqp.Publishing{
				ContentType:  "text/plain",
				DeliveryMode: amqp.Persistent,
				Body:         []byte(body),
				Expiration:   "10000", // 3000 3秒
			})
	}

	if err != nil {
		log.Fatalf("Failed to publish a message: %v", err)
	}

	fmt.Printf(" [x] Sent %s", body)
}

消费者
package main

import (
	"flag"
	"fmt"
	"log"

	amqp "github.com/rabbitmq/amqp091-go"
)

func main() {
	var url = flag.String("url", "amqp://admin:admin@localhost:5672/my_vhost", "RabbitMQ server URL")
	var exchange = flag.String("exchange", "logs", "Exchange name")
	var key = flag.String("key", "log", "Routing key")

	flag.Parse()

	// 连接到RabbitMQ服务器
	conn, err := amqp.Dial(*url)
	if err != nil {
		log.Fatalf("Failed to connect to RabbitMQ: %v", err)
	}
	defer conn.Close()

	// 创建一个通道
	ch, err := conn.Channel()
	if err != nil {
		log.Fatalf("Failed to open a channel: %v", err)
	}
	defer ch.Close()

	// 声明一个交换机
	err = ch.ExchangeDeclare(
		*exchange, // name: 交换机名称
		"fanout",  // kind: 交换机类型
		true,      // durable: 是否持久化
		false,     // autoDelete: 没有队列绑定时是否自动删除
		false,     // internal: 是否是内部交换机
		false,     // noWait: 是否需要等待服务器响应
		nil,       // args: 其他参数
	)
	if err != nil {
		log.Fatalf("Failed to declare an exchange: %v", err)
	}

	// 声明一个队列
	q, err := ch.QueueDeclare(
		"queue01", // 随机生成队列名称
		true,      // 持久化
		false,     // 删除
		false,     // 独占
		false,     // 不等消息
		nil,       // 其他参数
	)
	if err != nil {
		log.Fatalf("Failed to declare a queue: %v", err)
	}

	// 绑定队列到交换机
	err = ch.QueueBind(
		q.Name,    // 队列名称
		*key,      // 路由键
		*exchange, // 交换机名称
		false,     // 现在绑定
		nil,       // 其他参数
	)
	if err != nil {
		log.Fatalf("Failed to bind a queue: %v", err)
	}

	// 接收消息
	msgs, err := ch.Consume(
		q.Name,       // 队列名称
		"consumer01", // 消费者标签
		false,        // 自动ack
		false,        // 不独占
		false,        // 不等消息
		false,        // 不从服务器获取消息
		nil,          // 其他参数
	)
	if err != nil {
		log.Fatalf("Failed to register a consumer: %v", err)
	}

	fmt.Printf(" [*] Waiting for messages. To exit press CTRL+C\n")
	for d := range msgs {
		// 输出接收到的消息
		fmt.Printf(" [x] Received %s\n", d.Body)
		err = ch.Ack(d.DeliveryTag, true)
		if err != nil {
			log.Fatalf("Failed to ack message: %v", err)
		}
	}
}

可视化

看板

http://localhost:15672/

账户密码

admin
admin

在这里插入图片描述

消费进度

http://localhost:15672/#/queues

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重组蛋白表达系统优缺点对比|卡梅德生物

重组蛋白是现代生物技术中不可或缺的一部分&#xff0c;它们广泛应用于药物开发、研究工具和工业酶的生产。根据目标蛋白的特性和所需的修饰&#xff0c;可以选择不同的表达系统。下文罗列一下四个主要蛋白表达系统的优缺点&#xff1a; 1. 原核表达系统&#xff08;如大肠杆菌…

【QT实战】汇总导航

✨Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆…

深度学习之基于Tensorflow卷积神经网络(CNN)实现猫狗识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在人工智能和深度学习的热潮中&#xff0c;图像识别是一个备受关注的领域。猫狗识别作为图像识…

Milvus的内存索引

简介&#xff1a; 这篇文章主要介绍milvus支持的各种内存索引&#xff0c;以及它们最适用的场景&#xff0c;还有用户为了获得更好的搜索性能可以配置的参数。 索引是有效组织数据的过程&#xff0c;它的主要角色是在大的数据集中显著的加速耗时的查询从而有效的进行相似搜索…

【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)

最终效果 文章目录 最终效果前言素材模拟绳子钩子来回摆动发射回收钩子方法发射钩子回收钩子勾取物品随机生成物品其他源码完结 前言 在游戏发展史上&#xff0c;有些游戏以其简单而耐玩的特性&#xff0c;深深地烙印在了玩家的记忆中。《黄金矿工》就是其中之一&#xff0c;它…

SpringBootWeb 篇-深入了解 Mybatis 删除、新增、更新、查询的基础操作与 SQL 预编译解决 SQL 注入问题

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Mybatis 的基础操作 2.0 基础操作 - 环境准备 3.0 基础操作 - 删除操作 3.1 SQL 预编译 3.2 SQL 预编译的优势 3.3 参数占位符 4.0 基础操作 - 新增 4.1 主键返回…

每周节省7800万工时!ChatGPT等成美国降本增效利器

5月23日&#xff0c;全球最大教育、商业出版社之一的Pearson plc在官网发布了&#xff0c;ChatGPT等生成式AI如何帮助人们提升工作效率节省时间的深度研究报告。 该报告一共分析了美国、英国、澳大利亚、巴西和印度5个国家。到2026年&#xff0c;美国节省的时间最多&#xff0…

面试准备-项目【面试准备】

面试准备-项目【面试准备】 面试准备自我介绍&#xff1a;项目介绍&#xff1a; 论坛项目功能总结简介数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别为什…

GIS竞赛指南

全国大学生GIS应用技能大赛 全国大学生GIS应用技能大赛 主办单位:中国地理信息产业协会、中国地理学会 协办单位&#xff1a;广州大学(2023年) 参赛要求&#xff1a;每个学校一支队伍&#xff0c;限在读本科生组队不超过4人&#xff0c;指导老师不超过2人&#xff0c;一般学…

三磷酸肌醇(IP3)为细胞内信号转导分子 在医药、科研领域应用前景广阔

三磷酸肌醇&#xff08;IP3&#xff09;为细胞内信号转导分子 在医药、科研领域应用前景广阔 三磷酸肌醇又称为肌醇三磷酸&#xff0c;简称InsP3或IP3&#xff0c;是一种小信号分子&#xff0c;由磷脂酶C催化磷脂酰肌醇-4,5-二磷酸水解产生的&#xff0c;水解后剩下的甘油二酯停…

异众比率(variation ratio)

异众比率&#xff08;variation ratio&#xff09;是指非众数组的频数占总频数的比率&#xff0c;其计算公式为: 其中&#xff0c;为众数组的频数。 异众比率主要用于衡量众数对一组数据的代表程度。异众比率越大&#xff0c;说明非众数组的频数占总频数的比重越大&#xff0…

甭管几岁退休,都要做纵横驰骋的疯狂老太太

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / &#xff08;新&#xff09;声湃轩北京录音间 对许多年轻人来说&#xff0c;退休是此生最大的“延迟满足”。 手握不用干活…

高通 Android 12/13冻结屏幕

冻结屏幕很多第一次听到以为是Android一种异常现象&#xff0c;实则不然&#xff0c;就是防止用户在做一些非法操作导致问题防止安全漏洞问题。 1、主要通过用户行为比如禁止下拉状态栏和按键以及onTouch事件拦截等&#xff0c;不知道请看这篇文章&#xff08;Touch事件传递流…

html+css绘制自定义样式输入框

效果&#xff1a; 代码&#xff1a; html部分&#xff1a; <div class"box"> <div class"newbox"><input type"text" required><div class"name">Username</div></div> </div>css部分 …

aardio - godking.vlistEx虚表点击表头全选、排序

新版虚表内置了名称为 DefaultCheckedImg 和 DefaultUnCheckedImg 的两张图片&#xff0c;分别为 【选择框勾选状态默认图片】 和 【选择框未勾选状态默认图片】 以下代码调用了这两张图片&#xff0c;所以请将虚表库升级为最新版。 如果使用旧版库&#xff0c;可以自行添加这…

数据结构面试例题:括号匹配、栈实现队列、队列实现栈,循坏队列(C语言解决)

hello,这次我来用C语言和栈和队列相关问题&#xff0c;希望大家多多支持 括号匹配题目&#xff1a; OJ题目 首先我们不能用数量匹配来进行解答&#xff0c;因为你顺序不一定匹配 解析&#xff1a; 1、左括号入栈 2、右括号出栈顶左括号匹配 1.我们只需要找到右括号&#xff0c…

昔日辉煌不再,PHP老矣,尚能饭否?

导语 | 近期 TIOBE 最新指数显示&#xff0c;PHP 的流行度降至了历史最低&#xff0c;排在第 17 名&#xff0c;同时&#xff0c;在年度 Stack Overflow 开发者调查报告中&#xff0c;PHP 在开发者中的受欢迎程度已经从之前的约 30% 萎缩至现在的 18%。“PHP 是世界上最好的语言…

每日5题Day9 - LeetCode 41 - 45

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;41. 缺失的第一个正数 - 力扣&#xff08;LeetCode&#xff09; 今天这道题没有ac&#xff0c;写不动了&#xff0c;下次再通过吧&#xff0c;先给个半成品下次回…

装备制造项目管理软件:奥博思PowerProject项目管理系统

数字化正逐步改变着制造方式和企业组织模式。某制造企业领导层透露&#xff0c;在采用数字化项目管理模式后&#xff0c;企业的发展韧性更加强劲&#xff0c;构筑起了竞争新优势&#xff0c;企业产品研制周期缩短25%&#xff0c;生产效率提升18%。 随着全球经济的发展&#xf…