func (p *protocolV2) REQ(client *nsqd.ClientV2, params [][]byte) ([]byte, error) { state := atomic.LoadInt32(&client.State) if state != stateSubscribed && state != stateClosing { nsqd.NsqLogger().LogWarningf("[%s] command in wrong state: %v", client, state) return nil, protocol.NewFatalClientErr(nil, E_INVALID, "cannot REQ in current state") } if len(params) < 3 { return nil, protocol.NewFatalClientErr(nil, E_INVALID, "REQ insufficient number of params") } id, err := getFullMessageID(params[1]) if err != nil { return nil, protocol.NewFatalClientErr(nil, E_INVALID, err.Error()) } timeoutMs, err := protocol.ByteToBase10(params[2]) if err != nil { return nil, protocol.NewFatalClientErr(err, E_INVALID, fmt.Sprintf("REQ could not parse timeout %s", params[2])) } timeoutDuration := time.Duration(timeoutMs) * time.Millisecond if timeoutDuration < 0 || timeoutDuration > p.ctx.getOpts().MaxReqTimeout { return nil, protocol.NewFatalClientErr(nil, E_INVALID, fmt.Sprintf("REQ timeout %v out of range 0-%v", timeoutDuration, p.ctx.getOpts().MaxReqTimeout)) } if client.Channel == nil { return nil, protocol.NewFatalClientErr(nil, E_INVALID, "No channel") } err = client.Channel.RequeueMessage(client.ID, client.String(), nsqd.GetMessageIDFromFullMsgID(*id), timeoutDuration, true) if err != nil { client.IncrSubError(int64(1)) return nil, protocol.NewClientErr(err, "E_REQ_FAILED", fmt.Sprintf("REQ %v failed %s", *id, err.Error())) } client.RequeuedMessage(timeoutDuration > 0) return nil, nil }