1. 程式人生 > >【rabbitMQ之一】rabbitMQ之helloworld傳送與接受訊息-go語言

【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:
[email protected]
: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:[email protected]: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

管理介面: