/****************************************************************************** * 概述: ZmqReq 请求 * 函数名: Req * 返回值: * 参数列表: 参数名 参数类型 取值范围 描述 * *******************************************************************************/ func (this *ZmqReq) Req(servicepath string) (error, *dzhyun.SDSResponse) { stream, err0 := common.WrapRequest(DEFAULT_Version, servicepath, true) if err0 != nil { return err0, nil } if _, er1 := this.mreqSocket.SendBytes(stream, zmq4.DONTWAIT); er1 != nil { return er1, nil } stream2, err2 := this.mreqSocket.RecvBytes(0) // if err2 != nil { log4.Debug("zmqreq %s", err2.Error()) return err2, nil } if len(stream2) == 0 { log4.Debug("zmqreq timeout") return errors.New("req timeout"), nil } frm, err3 := common.UnwrapBaseProto(stream2) if err3 != nil { return err3, nil } mid := common.UnOffset(*frm.GetBody().Mid, 4) if mid[4-1] == 200 { return errors.New("failed protocal"), nil } res, err4 := common.UnwrapResponse(frm.GetBody().Mdata) if err4 != nil { return err4, nil } return nil, res }
/****************************************************************************** * 概述: 接收处理推送信息 * 函数名: dealSub * 返回值: * 参数列表: 参数名 参数类型 取值范围 描述 * *******************************************************************************/ func (this *ZmqSocket) dealSub(soc *zmq4.Socket, msgHeadFlag *bool) error { // log4.Debug("start deal sub0...") // this.mchooseMutex.RLocker() if !this.mChoose { // this.mchooseMutex.RUnlock() return nil } log4.Debug("start deal sub...") // this.mchooseMutex.RUnlock() for { if *msgHeadFlag { topic, err := soc.Recv(zmq4.DONTWAIT) if err != nil { errno1 := zmq4.AsErrno(err) switch errno1 { case zmq4.Errno(syscall.EAGAIN): return nil case zmq4.Errno(syscall.EINTR): continue default: log4.Debug("zmq req Get err %v, %d!", errno1, errno1) } } if len(topic) == 0 { // log4.Debug("sub return1") return nil } // log4.Debug("recv sub head =", topic) *msgHeadFlag = false } else { stream, err2 := soc.RecvBytes(zmq4.DONTWAIT) if err2 != nil { errno1 := zmq4.AsErrno(err2) switch errno1 { case zmq4.Errno(syscall.EAGAIN): return nil case zmq4.Errno(syscall.EINTR): continue default: log4.Debug("zmq req Get err %v, %d!", errno1, errno1) } } if len(stream) == 0 { // log4.Debug("sub return2") return nil } *msgHeadFlag = true frm, err3 := common.UnwrapBaseProto(stream) if err3 != nil { log4.Error("UnwrapBaseProto falied, %s", err3.Error()) return err3 } mid := common.UnOffset(*frm.GetBody().Mid, 4) if mid[4-1] == 200 { log4.Error("sdssdk zmqsub get mid == 200 err") continue } res, err4 := common.UnwrapResponse(frm.GetBody().Mdata) if err4 != nil { log4.Error("sdssdk sub UnwrapResponse error:", err4) continue } this.mzmq.MdataCache.UpdatePoints(res) } } return nil }