mirror of
https://gitee.com/shikong-sk/go-rabbitmq-study
synced 2025-02-23 15:32:14 +08:00
简单的生产者/消费者实现
This commit is contained in:
parent
79d84638cb
commit
8099800977
96
consumer_test.go
Normal file
96
consumer_test.go
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goccy/go-json"
|
||||||
|
"github.com/streadway/amqp"
|
||||||
|
"log"
|
||||||
|
"skcks.cn/study/rabbitmq/exchange"
|
||||||
|
"skcks.cn/study/rabbitmq/queue"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConsumer(t *testing.T) {
|
||||||
|
conn, err := amqp.Dial(ServerURL)
|
||||||
|
defer func(conn *amqp.Connection) {
|
||||||
|
_ = conn.Close()
|
||||||
|
}(conn)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("连接成功")
|
||||||
|
|
||||||
|
channel, err := conn.Channel()
|
||||||
|
defer func(channel *amqp.Channel) {
|
||||||
|
err := channel.Close()
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
}
|
||||||
|
}(channel)
|
||||||
|
|
||||||
|
errors := make([]error, 0)
|
||||||
|
// 声明交换机
|
||||||
|
err = exchange.DeclareDirect(channel, exchange.DefaultDirectExchangeName)
|
||||||
|
errors = append(errors, exchange.DeclareDirect(channel, exchange.DefaultDirectExchangeName))
|
||||||
|
|
||||||
|
queue1 := "direct_queue1"
|
||||||
|
queue2 := "direct_queue2"
|
||||||
|
route1 := "teacher"
|
||||||
|
route2 := "student"
|
||||||
|
// 声明队列
|
||||||
|
errors = append(errors, queue.DeclareDirect(channel, queue1))
|
||||||
|
errors = append(errors, queue.DeclareDirect(channel, queue2))
|
||||||
|
|
||||||
|
// 声明交换机与队列绑定及路由关系
|
||||||
|
errors = append(errors, channel.QueueBind(queue1, route1, exchange.DefaultDirectExchangeName, false, nil))
|
||||||
|
errors = append(errors, channel.QueueBind(queue2, route2, exchange.DefaultDirectExchangeName, false, nil))
|
||||||
|
|
||||||
|
if len(errors) > 0 {
|
||||||
|
for _, err := range errors {
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
messages1, err := channel.Consume(
|
||||||
|
queue1,
|
||||||
|
"consumer1",
|
||||||
|
true,
|
||||||
|
false, // exclusive
|
||||||
|
false, // no-local
|
||||||
|
false, // no-wait
|
||||||
|
nil, // args
|
||||||
|
)
|
||||||
|
|
||||||
|
messages2, err := channel.Consume(
|
||||||
|
queue2,
|
||||||
|
"consumer2",
|
||||||
|
true,
|
||||||
|
false, // exclusive
|
||||||
|
false, // no-local
|
||||||
|
false, // no-wait
|
||||||
|
nil, // args
|
||||||
|
)
|
||||||
|
|
||||||
|
forever := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
for d := range messages1 {
|
||||||
|
var msg = &Message{}
|
||||||
|
_ = json.Unmarshal(d.Body, msg)
|
||||||
|
t.Logf("接收 %s 消息: %s %s", queue1, d.Body, time.Unix(-1, msg.NanoTime).Format("2006-01-02 15:04:05.000000000"))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
for d := range messages2 {
|
||||||
|
var msg = &Message{}
|
||||||
|
_ = json.Unmarshal(d.Body, msg)
|
||||||
|
t.Logf("接收 %s 消息: %s %s", queue2, d.Body, time.Unix(-1, msg.NanoTime).Format("2006-01-02 15:04:05.000000000"))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
log.Printf("Waiting for messages. To exit press CTRL+C")
|
||||||
|
<-forever
|
||||||
|
}
|
5
go.mod
5
go.mod
@ -2,4 +2,7 @@ module skcks.cn/study/rabbitmq
|
|||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require github.com/streadway/amqp v1.0.0 // indirect
|
require (
|
||||||
|
github.com/goccy/go-json v0.9.11 // indirect
|
||||||
|
github.com/streadway/amqp v1.0.0 // indirect
|
||||||
|
)
|
||||||
|
2
go.sum
2
go.sum
@ -1,2 +1,4 @@
|
|||||||
|
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
|
||||||
|
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo=
|
github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo=
|
||||||
github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||||
|
59
main.go
59
main.go
@ -4,11 +4,20 @@ import (
|
|||||||
"github.com/streadway/amqp"
|
"github.com/streadway/amqp"
|
||||||
"log"
|
"log"
|
||||||
"skcks.cn/study/rabbitmq/exchange"
|
"skcks.cn/study/rabbitmq/exchange"
|
||||||
|
"skcks.cn/study/rabbitmq/publish"
|
||||||
"skcks.cn/study/rabbitmq/queue"
|
"skcks.cn/study/rabbitmq/queue"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const ServerURL = "amqp://shikong:12341234@10.10.10.100:15672"
|
const ServerURL = "amqp://shikong:12341234@10.10.10.100:15672"
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
Time int64
|
||||||
|
MilliTime int64
|
||||||
|
MicroTime int64
|
||||||
|
NanoTime int64
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
conn, err := amqp.Dial(ServerURL)
|
conn, err := amqp.Dial(ServerURL)
|
||||||
defer func(conn *amqp.Connection) {
|
defer func(conn *amqp.Connection) {
|
||||||
@ -22,12 +31,56 @@ func main() {
|
|||||||
log.Println("连接成功")
|
log.Println("连接成功")
|
||||||
|
|
||||||
channel, err := conn.Channel()
|
channel, err := conn.Channel()
|
||||||
|
defer func(channel *amqp.Channel) {
|
||||||
|
err := channel.Close()
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
}
|
||||||
|
}(channel)
|
||||||
|
|
||||||
errors := make([]error, 0)
|
errors := make([]error, 0)
|
||||||
|
// 声明交换机
|
||||||
err = exchange.DeclareDirect(channel, exchange.DefaultDirectExchangeName)
|
err = exchange.DeclareDirect(channel, exchange.DefaultDirectExchangeName)
|
||||||
errors = append(errors, exchange.DeclareDirect(channel, exchange.DefaultDirectExchangeName))
|
errors = append(errors, exchange.DeclareDirect(channel, exchange.DefaultDirectExchangeName))
|
||||||
errors = append(errors, queue.DeclareDirect(channel, "direct_queue1"))
|
|
||||||
errors = append(errors, queue.DeclareDirect(channel, "direct_queue2"))
|
queue1 := "direct_queue1"
|
||||||
|
queue2 := "direct_queue2"
|
||||||
|
route1 := "teacher"
|
||||||
|
route2 := "student"
|
||||||
|
// 声明队列
|
||||||
|
errors = append(errors, queue.DeclareDirect(channel, queue1))
|
||||||
|
errors = append(errors, queue.DeclareDirect(channel, queue2))
|
||||||
|
|
||||||
|
// 声明交换机与队列绑定及路由关系
|
||||||
|
errors = append(errors, channel.QueueBind(queue1, route1, exchange.DefaultDirectExchangeName, false, nil))
|
||||||
|
errors = append(errors, channel.QueueBind(queue2, route2, exchange.DefaultDirectExchangeName, false, nil))
|
||||||
|
|
||||||
|
ch := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
for j := 0; j < 1000_0000; j++ {
|
||||||
|
_ = publish.Send(channel,
|
||||||
|
exchange.DefaultDirectExchangeName, route1, false, false, &Message{
|
||||||
|
Time: time.Now().Unix(),
|
||||||
|
MilliTime: time.Now().UnixMilli(),
|
||||||
|
MicroTime: time.Now().UnixMicro(),
|
||||||
|
NanoTime: time.Now().UnixNano(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
_ = publish.Send(channel,
|
||||||
|
exchange.DefaultDirectExchangeName, route2, false, false, &Message{
|
||||||
|
Time: time.Now().Unix(),
|
||||||
|
MilliTime: time.Now().UnixMilli(),
|
||||||
|
MicroTime: time.Now().UnixMicro(),
|
||||||
|
NanoTime: time.Now().UnixNano(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ch <- true
|
||||||
|
}()
|
||||||
|
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
for _, err := range errors {
|
for _, err := range errors {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -35,4 +88,6 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<-ch
|
||||||
}
|
}
|
||||||
|
32
publish/publish.go
Normal file
32
publish/publish.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package publish
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goccy/go-json"
|
||||||
|
"github.com/streadway/amqp"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Send(channel *amqp.Channel, exchange, route string, mandatory, immediate bool, data interface{}) error {
|
||||||
|
bytes, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = channel.Publish(
|
||||||
|
exchange, // exchange
|
||||||
|
route, // routing key
|
||||||
|
false, // mandatory
|
||||||
|
false, // immediate
|
||||||
|
amqp.Publishing{
|
||||||
|
Headers: amqp.Table{},
|
||||||
|
ContentType: "text/plain",
|
||||||
|
ContentEncoding: "",
|
||||||
|
Body: bytes,
|
||||||
|
//Expiration: "60000", // 消息过期时间
|
||||||
|
},
|
||||||
|
); err != nil {
|
||||||
|
log.Println("Failed to publish a message:", err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user