This commit is contained in:
zhouyuyan committed 2017-09-08 09:59:01 +08:00
1 parent 7073e9b4ba
commit 7f45bd6bc9
1 file changed
+22 -36
+22 -36
View File
@@ -2,6 +2,7 @@ package broker
import ( import (
"hmq/packets" "hmq/packets"
"math/rand"
"net" "net"
"strings" "strings"
"sync" "sync"
@@ -221,40 +222,32 @@ func (c *client) ProcessPublishMessage(packet *packets.PublishPacket) {
} }
} }
subinfo, exist := b.queues[topic] idx := GenerateRangeNum(0, len(r.qsubs))
qnum := 0 for {
var qsub *subscription sub := r.qsubs[idx]
if exist { if sub.client.typ == ROUTER {
idx := subinfo.index if typ == ROUTER {
for _, sub := range r.qsubs { idx = GenerateRangeNum(0, len(r.qsubs))
if sub.client.typ == ROUTER { continue
if typ == ROUTER {
continue
}
} }
if idx <= qnum {
qsub = sub
break
}
if sub.client.typ == CLIENT {
qnum = qnum + 1
} else {
qnum = qnum + sub.client.rsubs[topic].num
}
} }
subinfo.index = (idx + 1) % subinfo.count if sub != nil {
} err := sub.client.WriterPacket(packet)
if err != nil {
if qsub != nil { log.Error("process will message for qsub error, ", err)
err := qsub.client.WriterPacket(packet) }
if err != nil { break
log.Error("process will message for qsub error, ", err)
} }
} }
} }
func GenerateRangeNum(min, max int) int {
// rand.Seed(time.Now().Unix())
randNum := rand.Intn(max-min) + min
return randNum
}
func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) { func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
b := c.broker b := c.broker
if b == nil { if b == nil {
@@ -280,12 +273,6 @@ 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] = &Queue{
count: 0,
index: 0,
}
}
} else { } else {
retcodes = append(retcodes, QosFailure) retcodes = append(retcodes, QosFailure)
continue continue
@@ -301,7 +288,7 @@ func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
case CLIENT: case CLIENT:
if _, exist := c.subs[topic]; !exist { if _, exist := c.subs[topic]; !exist {
c.subs[topic] = sub c.subs[topic] = sub
b.queues[topic].count++
} else { } else {
//if exist ,check whether qos change //if exist ,check whether qos change
c.subs[topic].qos = qoss[i] c.subs[topic].qos = qoss[i]
@@ -312,11 +299,10 @@ func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
if subinfo, exist := c.rsubs[topic]; !exist { if subinfo, exist := c.rsubs[topic]; !exist {
sinfo := &subInfo{sub: sub, num: 1} sinfo := &subInfo{sub: sub, num: 1}
c.rsubs[topic] = sinfo c.rsubs[topic] = sinfo
b.queues[topic].count++
} else { } else {
subinfo.num = subinfo.num + 1 subinfo.num = subinfo.num + 1
retcodes = append(retcodes, qoss[i]) retcodes = append(retcodes, qoss[i])
b.queues[topic].count++
continue continue
} }
} }