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

  1. Lower the Will message QoS to 0 or 1
  2. 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.