alibaba/canal · error · CanalClientException

mq get/ack not support concurrent & async ack

Error message

mq get/ack not support concurrent & async ack

What it means

Error "mq get/ack not support concurrent & async ack" thrown in alibaba/canal.

Source

Thrown at client/src/main/java/com/alibaba/otter/canal/client/pulsarmq/PulsarMQCanalConnector.java:384

        return getListWithoutAck();
    }

    /**
     * 获取泛型数据,供其他方法调用
     * <p>
     * 不支持多线程调用
     * </p>
     *
     * @return java.util.List<T>
     * @date 2021/9/14 15:20
     * @author chad
     * @since 1 by chad at 2021/9/14
     * 供{@link PulsarMQCanalConnector#getListWithoutAck(Long, TimeUnit)}
     * 和{@link PulsarMQCanalConnector#getFlatListWithoutAck(Long, TimeUnit)}调用
     */
    private <T> List<T> getListWithoutAck() {
        if (null != this.lastGetBatchMessage) {
            throw new CanalClientException("mq get/ack not support concurrent & async ack");
        }
        List messageList = Lists.newArrayList();

        try {
            this.lastGetBatchMessage = consumer.batchReceive();
            if (null == this.lastGetBatchMessage || this.lastGetBatchMessage.size() < 1) {
                this.lastGetBatchMessage = null;
                return messageList;
            }
        } catch (PulsarClientException e) {
            logger.error("Receiver Pulsar MQ message error", e);
            throw new CanalClientException(e);
        }

        for (org.apache.pulsar.client.api.Message<byte[]> msgExt : this.lastGetBatchMessage) {
            byte[] data = msgExt.getData();
            if (data == null) {
                logger.warn("Received message data is null");

View on GitHub (pinned to 87be50e876)

Solutions

  1. Do not enable concurrent/async ack mode with the Pulsar MQ connector; call ack(batchId) synchronously after processing each batch.
  2. Set the consumer to single-threaded get/ack processing or use flatMessage batch handling without async ack.

When it happens

Trigger: Thrown at client/src/main/java/com/alibaba/otter/canal/client/pulsarmq/PulsarMQCanalConnector.java:384 when the library encounters an invalid state.

Common situations: Concurrent async ack on MQ connector. Serialize acks per batch or disable async ack in configuration; the underlying MQ client cannot correlate concurrent acknowledgements.


AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14). Data as JSON: /api/errors/983873e569175b54. Report an issue: GitHub.