alibaba/canal · warning · CanalClientException
stop connect error
Error message
stop connect error
What it means
Thrown by CanalRabbitMQConsumer.disconnect when connect.close() (the underlying RabbitMQ Connection) raises an IOException during shutdown. Reached after the channel close block, so the channel was already attempted; this is the final teardown step failing.
Source
Thrown at connector/rabbitmq-connector/src/main/java/com/alibaba/otter/canal/connector/rabbitmq/consumer/CanalRabbitMQConsumer.java:221
this.lastGetBatchMessage = null;
}
}
@Override
public void disconnect() {
if (channel != null) {
try {
channel.close();
} catch (IOException | TimeoutException e) {
throw new CanalClientException("stop channel error", e);
}
}
if (connect != null) {
try {
connect.close();
} catch (IOException e) {
throw new CanalClientException("stop connect error", e);
}
}
}
}
View on GitHub (pinned to 87be50e876)
Solutions
- Make connection close best-effort: catch and log IOException instead of propagating, since shutdown teardown failures are rarely recoverable.
- Guard against double-close by checking connect != null and nulling it after close.
- If channel.close() already failed, expect connection.close() may also fail — handle both leniently.
Example fix
// before
if (connect != null) {
try {
connect.close();
} catch (IOException e) {
throw new CanalClientException("stop connect error", e);
}
}
// after — lenient shutdown, null out reference
if (connect != null) {
try { connect.close(); }
catch (IOException e) { logger.warn("Error closing rabbitmq connection", e); }
finally { connect = null; }
} Defensive patterns
Strategy: try-catch
Validate before calling
if (connect == null) return;
Try / catch
if (connect != null) {
try { connect.close(); }
catch (IOException e) { logger.warn("Error closing rabbitmq connection", e); }
finally { connect = null; }
} Prevention
- Make disconnect idempotent and null out the connection reference.
- Log, do not throw, on connection-close failures during shutdown.
- Expect connection.close() to also fail if channel.close() already failed.
When it happens
Trigger: connect.close() at line 219 throws IOException. Causes: connection already closed/broken; broker unreachable during shutdown; an earlier channel-level failure left the connection in a bad state.
Common situations: Broker restarted just before shutdown; network already down; double disconnect; shutdown racing with a broker-initiated connection drop.
Related errors
- stop channel error
- Stop RabbitMQ producer error
- Disconnect pulsar consumer error
- Start RabbitMQ producer error
- error
AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14).
Data as JSON: /api/errors/1f3a3cbd98448b19.
Report an issue: GitHub.