【rabbitMQ之一】rabbitMQ之helloworld发送与接受消息-go语言

1.准备工作

启动rabbitmq_server,在浏览器上打开rabbitMQ的管理器

2.发送端程序

开始如果导入

"github.com/streadway/amqp" 出现错误,则先在goLand下面的终端,运行go get "github.com/streadway/amqp"

package main

import (
"log"

"github.com/streadway/amqp"
	"strconv"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // 建立连接
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	ch, err := conn.Channel()  // 创建channel
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	/*
	Delivery       Exchange  Key       Queue
  -----------------------------------------------
 	 key: alerts -> ""     -> alerts -> alerts
	 */

	q, err := ch.QueueDeclare(   // 创建消息队列,queue,并分配默认binding,empty exchange
		"hello", // name 消息队列的名字
		false,   // durable   // 队列持久化
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")


	for i:=0; i<100; i++ {
		body := "hello" + strconv.Itoa(i)
		err = ch.Publish(     // 发布消息,第一个参数表示路由名称(exchange),""则表示使用默认消息路由
			"",     // exchange
			q.Name, // routing key  "hello"
			false,  // mandatory
			false,  // immediate
			amqp.Publishing{
				ContentType: "text/plain",
				Body:        []byte(body),
			})
		log.Printf(" [x] Sent %s", body)
	}

	failOnError(err, "Failed to publish a message")
}

3.接受端程序

package main

import (
"log"

"github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	q, err := ch.QueueDeclare(     // 消息队列
		"hello", // name
		false,   // durable 队列持久化
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")

	msgs, err := ch.Consume(
		q.Name, // queue
		"",     // consumer
		true,   // auto-ack  自动ACK
		false,  // exclusive
		false,  // no-local
		false,  // no-wait
		nil,    // args
	)
	failOnError(err, "Failed to register a consumer")

	forever := make(chan bool)   // 创建bool型的channel

	go func() {
		for d := range msgs {
			log.Printf("Received a message: %s", d.Body)
		}
	}()

	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
	<-forever   // 从forever信道中取数据,必须要有数据流进来才可以,不然main在此阻塞
}

4.运行程序

启动一个发送程序,启动两个接受程序

发送方:


接受方1 接受方2

管理界面:




猜你喜欢

转载自blog.csdn.net/smile_yangyue/article/details/80707558