This commit is contained in:
zhouyuyan committed 2017-09-08 10:44:01 +08:00
1 parent 7f45bd6bc9
commit 258912b33a
2 files changed
+51 -24

No files matched your search

+2 -6
View File
@@ -26,11 +26,7 @@ type Broker struct {
remotes sync.Map remotes sync.Map
sl *Sublist sl *Sublist
rl *RetainList rl *RetainList
queues map[string]*Queue queues map[string]int
}
type Queue struct {
count int
index int
} }
func NewBroker(config *Config) (*Broker, error) { func NewBroker(config *Config) (*Broker, error) {
@@ -39,7 +35,7 @@ func NewBroker(config *Config) (*Broker, error) {
config: config, config: config,
sl: NewSublist(), sl: NewSublist(),
rl: NewRetainList(), rl: NewRetainList(),
queues: make(map[string]*Queue), queues: make(map[string]int),
} }
if b.config.TlsPort != "" { if b.config.TlsPort != "" {
tlsconfig, err := NewTLSConfig(b.config.TlsInfo) tlsconfig, err := NewTLSConfig(b.config.TlsInfo)
+49 -18
View File
@@ -2,7 +2,6 @@ package broker
import ( import (
"hmq/packets" "hmq/packets"
"math/rand"
"net" "net"
"strings" "strings"
"sync" "sync"
@@ -222,30 +221,59 @@ func (c *client) ProcessPublishMessage(packet *packets.PublishPacket) {
} }
} }
idx := GenerateRangeNum(0, len(r.qsubs)) pre := 0
for { now := -1
sub := r.qsubs[idx] t := "$queue/" + topic
if sub.client.typ == ROUTER { cnt, exist := b.queues[t]
if typ == ROUTER { if exist {
idx = GenerateRangeNum(0, len(r.qsubs)) log.Info("queue index : ", cnt)
continue for _, sub := range r.qsubs {
if sub.client.typ == ROUTER {
if c.typ == ROUTER {
continue
}
} }
} if c.typ == CLIENT {
if sub != nil { now = now + 1
err := sub.client.WriterPacket(packet) } else {
if err != nil { now = now + sub.client.rsubs[t].num
log.Error("process will message for qsub error, ", err)
} }
break if cnt >= pre && cnt <= now {
if sub != nil {
err := sub.client.WriterPacket(packet)
if err != nil {
log.Error("send publish error, ", err)
}
}
break
}
pre = now
} }
} }
length := getQueueSubscribeNum(r.qsubs)
if length > 0 {
b.queues[t] = (b.queues[t] + 1) % length
}
} }
func GenerateRangeNum(min, max int) int { func getQueueSubscribeNum(qsubs []*subscription) int {
// rand.Seed(time.Now().Unix()) topic := "$queue/"
randNum := rand.Intn(max-min) + min if len(qsubs) < 1 {
return randNum return 0
} else {
topic = topic + qsubs[0].topic
}
num := 0
for _, sub := range qsubs {
if sub.client.typ == CLIENT {
num = num + 1
} else {
num = num + sub.client.rsubs[topic].num
}
}
return num
} }
func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) { func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
@@ -273,6 +301,9 @@ func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
if queue { if queue {
if len(t) > 7 { if len(t) > 7 {
t = t[7:] t = t[7:]
if _, exists := b.queues[topic]; !exists {
b.queues[topic] = 0
}
} else { } else {
retcodes = append(retcodes, QosFailure) retcodes = append(retcodes, QosFailure)
continue continue