go语言操作rabbitmq

go 复制代码
package main

import (
	"fmt"
	"log"
	"sync"
	"time"

	"github.com/streadway/amqp"
)

func declareQueue(ch *amqp.Channel, queueName string) error {
	_, err := ch.QueueDeclare(
		queueName, // name
		false,     // durable
		false,     // delete when unused
		false,     // exclusive
		false,     // no-wait
		nil,       // arguments
	)
	return err
}

func producer(ch *amqp.Channel, wg *sync.WaitGroup, queueName string) {
	defer wg.Done()

	for i := 1; i <= 5; i++ {
		message := fmt.Sprintf("Message %d", i)

		err := ch.Publish(
			"",        // exchange
			queueName, // routing key
			false,     // mandatory
			false,     // immediate
			amqp.Publishing{
				ContentType: "text/plain",
				Body:        []byte(message),
			})

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

		fmt.Printf("Sent: %s\n", message)
		time.Sleep(time.Second)
	}
}

func consumer(ch *amqp.Channel, wg *sync.WaitGroup, queueName string) {
	defer wg.Done()

	msgs, err := ch.Consume(
		queueName, // queue
		"",        // consumer
		true,      // auto-ack
		false,     // exclusive
		false,     // no-local
		false,     // no-wait
		nil,       // args
	)

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

	for msg := range msgs {
		fmt.Printf("Received: %s\n", msg.Body)
	}
}

func main() {
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	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()

	queueName := "your_queue_name"

	// Declare the queue before using it
	err = declareQueue(ch, queueName)
	if err != nil {
		log.Fatalf("Failed to declare queue: %v", err)
	}

	var wg sync.WaitGroup
	wg.Add(2)

	go producer(ch, &wg, queueName)
	go consumer(ch, &wg, queueName)

	wg.Wait()
}

运行结果

go 复制代码
Sent: Message 1    
Received: Message 1
Sent: Message 2
Received: Message 2
Sent: Message 3
Received: Message 3
Sent: Message 4
Received: Message 4
Sent: Message 5
Received: Message 5
相关推荐
不会写代码的ys1 小时前
仿RabbitMQ实现消息队列(一)--项目介绍
分布式·rabbitmq
兜兜风d'3 小时前
RabbitMQ死信队列详解
c++·rabbitmq·java-rabbitmq
程序员卷卷狗7 小时前
RabbitMQ 在拼团系统中的应用:延迟队列、订单超时与消息幂等
rabbitmq·ruby·java-rabbitmq
数据知道9 小时前
Go语言设计模式:工厂模式详解
开发语言·设计模式·golang·go语言·工厂模式
人邮异步社区14 小时前
推荐几本学习计算机语言的书
java·c语言·c++·python·学习·golang
千码君201621 小时前
Go语言:解决 “package xxx is not in std”的思路
开发语言·后端·golang
Ypuyu21 小时前
【GoLang】【框架学习】【GORM】4. 使用 BeforeUpdate hook 操作时,出现反射报错
开发语言·学习·golang
兜兜风d'1 天前
RabbitMQ消息分发详解:从默认轮询到智能负载均衡
spring boot·分布式·rabbitmq·负载均衡·ruby·java-rabbitmq
脚踏实地的大梦想家1 天前
【Go】P17 Go语言并发编程核心:深入理解 Goroutine (从入门到实战)
java·开发语言·golang
zyh200504301 天前
RabbitMQ概述
分布式·消息队列·rabbitmq·消息中间件·amqp