【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

管理界面:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值