package mainimport ("fmt""github.com/streadway/amqp""time")// Every connection should declare the topology they expectfunc setup(url, queue string) (*amqp.Connection, *amqp.Channel, error) { //setup connection conn, err := amqp.Dial(url) if err != nil { return nil, nil, err } //build channel in the connection ch, err := conn.Channel() if err != nil { return nil, nil, err } //queue declare if _, err := ch.QueueDeclare(queue, false, true, false, false, nil); err != nil { return nil, nil, err } return conn, ch, nil}func main() { //amqp url url := "amqp://guest:guest@127.0.0.1:5672"; for i := 1; i <= 2; i++ { fmt.Println("connect ", i) //two goroutine go func() { //queue name queue := fmt.Sprintf("example.reconnect.%d", i) //setup channel in the tcp connection _, pub, err := setup(url, queue) if err != nil { fmt.Println("err publisher setup:", err) return } // Purge the queue from the publisher side to establish initial state if _, err := pub.QueuePurge(queue, false); err != nil { fmt.Println("err purge:", err) return } //publish msg if err := pub.Publish("", queue, false, false, amqp.Publishing{ Body: []byte(fmt.Sprintf("%d", i)), }); err != nil { fmt.Println("err publish:", err) return } //keep running for{ time.Sleep(time.Second * 20) } }() } //keep running for { time.Sleep(time.Second * 20) }}我以为程序和mq-server之间只有一个连接,但是有两个连接,一个连接只能支持一个通道,为什么?两个goroutine不能共享同一个tcp连接吗?理论上套接字描述符可以在一个进程的所有线程中共享。为什么两个 goroutine 不共享一个 socket 而是有自己的通道?手工模型:rabbitmq中的真实模型:
1 回答
- 1 回答
- 0 关注
- 234 浏览
添加回答
举报
0/150
提交
取消