// For SUBSCRIBE message, we should add subscriber, then send back SUBACK func (this *service) processSubscribe(msg *message.SubscribeMessage) error { resp := message.NewSubackMessage() resp.SetPacketId(msg.PacketId()) // Subscribe to the different topics var retcodes []byte topics := msg.Topics() qos := msg.Qos() this.rmsgs = this.rmsgs[0:0] for i, t := range topics { rqos, err := this.topicsMgr.Subscribe(t, qos[i], &this.onpub) if err != nil { return err } this.sess.AddTopic(string(t), qos[i]) retcodes = append(retcodes, rqos) // yeah I am not checking errors here. If there's an error we don't want the // subscription to stop, just let it go. this.topicsMgr.Retained(t, &this.rmsgs) glog.Debugf("(%s) topic = %s, retained count = %d", this.cid(), string(t), len(this.rmsgs)) } if err := resp.AddReturnCodes(retcodes); err != nil { return err } if _, err := this.writeMessage(resp); err != nil { return err } for _, rm := range this.rmsgs { if err := this.publish(rm, nil); err != nil { glog.Errorf("service/processSubscribe: Error publishing retained message: %v", err) return err } } return nil }
// For SUBSCRIBE message, we should add subscriber, then send back SUBACK func (this *service) processSubscribe(msg *message.SubscribeMessage) error { resp := message.NewSubackMessage() resp.SetPacketId(msg.PacketId()) // Subscribe to the different topics var retcodes []byte topics := msg.Topics() qos := msg.Qos() // fmt.Printf("this.id: %d, this.sess.ID(): %s\n", this.id, this.cid()) for i, t := range topics { rqos, err := this.topicsMgr.Subscribe(t, qos[i], &this.onpub, this.sess.ID()) // rqos, err := this.topicsMgr.Subscribe(t, qos[i], &this) if err != nil { Log.Errorc(func() string { return fmt.Sprintf("(%s) subscribe topic %s failed: %s", this.cid(), t, err) }) this.stop() return err } Log.Infoc(func() string { return fmt.Sprintf("(%s) subscribe topic %s", this.cid(), t) }) this.sess.AddTopic(string(t), qos[i]) retcodes = append(retcodes, rqos) } if err := resp.AddReturnCodes(retcodes); err != nil { return err } if _, err := this.writeMessage(resp); err != nil { return err } for _, t := range topics { go this.pushOfflineMessage(string(t)) } return nil }