标签:data erro int consumer 取数 info client 问题 为什么
一条消息的产生-》消息队列-》消费-》完整的流程
简单演示,一个生产者对多消费者
server.go
package main
import(
"fmt"
"log"
"net/http"
)
func main(){
mux := http.NewServeMux()
mux.HandleFunc("/Login",Login)
mux.HandleFunc("/Consumer1",Consumer1)
mux.HandleFunc("/Consumer2",Consumer2)
mux.HandleFunc("/Consumer3",Consumer3)
if err:=http.ListenAndServe(":8080",mux);err!=nil{
log.Fatal(err)
}
}
/*一个生产者和多消费者*/
// 假定一个生产者
func Login(w http.ResponseWriter,r *http.Request){
if r.Method != "GET"{
return
}
fmt.Fprint(w,"生产者来了")
}
// 多个消费者
func Consumer1(w http.ResponseWriter,r *http.Request){
if r.Method != "GET"{
return
}
fmt.Fprint(w,"消费者1")
}
func Consumer2(w http.ResponseWriter,r *http.Request){
if r.Method != "GET"{
return
}
fmt.Fprint(w,"消费者2")
}
func Consumer3(w http.ResponseWriter,r *http.Request){
if r.Method != "GET"{
return
}
fmt.Fprint(w,"消费者3")
}
client.go
package main
import(
"fmt"
"sync"
"net/http"
"io/ioutil"
)
type Message struct{
Data string
}
var wg sync.WaitGroup
// 使用切片充当队列
var messages []*Message
func main(){
fmt.Println("客户端这边执行消息队列")
producer()
wg.Add(3)
// 轮询,获取消息
for{
if len(messages)>0{
// 按需获取消息
if messages[0]!=nil{
go comsumer("Consumer1")
go comsumer("Consumer2")
go comsumer("Consumer3")
wg.Wait()
break
}
}
}
fmt.Println("打印结果")
}
// 生产者
func producer()error{
mg := Message{}
res,err := http.Get("http://localhost:8080/Login")
if err!=nil{
fmt.Println("err :",err)
return err
}
defer res.Body.Close()
data,err := ioutil.ReadAll(res.Body)
if err!=nil{
fmt.Println("err:",err)
return err
}
fmt.Println(string(data))
mg.Data = string(data)
messages = append(messages,&mg)
return nil
}
// 消费者
func comsumer(url string)error{
defer wg.Done()
mg := Message{}
res,err := http.Get("http://localhost:8080/"+url)
if err!=nil{
fmt.Println("err :",err)
return err
}
defer res.Body.Close()
data,err := ioutil.ReadAll(res.Body)
if err!=nil{
fmt.Println("err:",err)
return err
}
fmt.Println(string(data))
mg.Data = string(data)
messages = append(messages,&mg)
return nil
}
输出结果
客户端这边执行消息队列
生产者来了
消费者2
消费者3
消费者1
打印结果
明确观点:本人觉得,消息队列是客户端和服务端的一个中间插件
学习资料
标签:data erro int consumer 取数 info client 问题 为什么
原文地址:https://www.cnblogs.com/MyUniverse/p/11626259.html