nats-io/nats-server · error
mqttConnAckRCQoS2WillRejected
mqttConnAckRCQoS2WillRejected
Error message
server does not accept QoS2 for Will messages
What it means
Server policy check in mqttParseConnect: the server is configured with rejectQoS2Pub and the client's Will message requests QoS 2. The CONNACK return code mqttConnAckRCQoS2WillRejected is returned to the client along with this error.
Source
Thrown at server/mqtt.go:3847
if cp.flags&mqttConnFlagWillFlag == 0 {
// Spec [MQTT-3.1.2-13]
if wqos != 0 {
return 0, nil, fmt.Errorf("if Will flag is set to 0, Will QoS must be 0 too, got %v", wqos)
}
// Spec [MQTT-3.1.2-15]
if wretain {
return 0, nil, errMQTTWillAndRetainFlag
}
} else {
// Spec [MQTT-3.1.2-14]
if wqos == 3 {
return 0, nil, fmt.Errorf("if Will flag is set to 1, Will QoS can be 0, 1 or 2, got %v", wqos)
}
hasWill = true
}
if c.mqtt.rejectQoS2Pub && hasWill && wqos == 2 {
return mqttConnAckRCQoS2WillRejected, nil, fmt.Errorf("server does not accept QoS2 for Will messages")
}
// Spec [MQTT-3.1.2-19]
hasUser := cp.flags&mqttConnFlagUsernameFlag != 0
// Spec [MQTT-3.1.2-21]
hasPassword := cp.flags&mqttConnFlagPasswordFlag != 0
// Spec [MQTT-3.1.2-22]
if !hasUser && hasPassword {
return 0, nil, errMQTTPasswordFlagAndNoUser
}
// Keep alive
var ka uint16
ka, err = r.readUint16("keep alive")
if err != nil {
return 0, nil, err
}
// Spec [MQTT-3.1.2-24]View on GitHub (pinned to 3a66a489d2)
Solutions
- Lower the Will message QoS to 0 or 1
- Disable the server's QoS 2 rejection policy if Will messages need QoS 2
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/mqtt.go:3847 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/ad3b48e58aa8af3b.
Report an issue: GitHub.