{"record":{"id":"983873e569175b54","repo":"alibaba/canal","slug":"mq-get-ack-not-support-concurrent-async-ack","errorCode":null,"errorMessage":"mq get/ack not support concurrent & async ack","messagePattern":"mq get/ack not support concurrent & async ack","errorType":"exception","errorClass":"CanalClientException","httpStatus":null,"severity":"error","filePath":"client/src/main/java/com/alibaba/otter/canal/client/pulsarmq/PulsarMQCanalConnector.java","lineNumber":384,"sourceCode":"        return getListWithoutAck();\n    }\n\n    /**\n     * 获取泛型数据，供其他方法调用\n     * <p>\n     * 不支持多线程调用\n     * </p>\n     *\n     * @return java.util.List<T>\n     * @date 2021/9/14 15:20\n     * @author chad\n     * @since 1 by chad at 2021/9/14\n     * 供{@link PulsarMQCanalConnector#getListWithoutAck(Long, TimeUnit)}\n     * 和{@link PulsarMQCanalConnector#getFlatListWithoutAck(Long, TimeUnit)}调用\n     */\n    private <T> List<T> getListWithoutAck() {\n        if (null != this.lastGetBatchMessage) {\n            throw new CanalClientException(\"mq get/ack not support concurrent & async ack\");\n        }\n        List messageList = Lists.newArrayList();\n\n        try {\n            this.lastGetBatchMessage = consumer.batchReceive();\n            if (null == this.lastGetBatchMessage || this.lastGetBatchMessage.size() < 1) {\n                this.lastGetBatchMessage = null;\n                return messageList;\n            }\n        } catch (PulsarClientException e) {\n            logger.error(\"Receiver Pulsar MQ message error\", e);\n            throw new CanalClientException(e);\n        }\n\n        for (org.apache.pulsar.client.api.Message<byte[]> msgExt : this.lastGetBatchMessage) {\n            byte[] data = msgExt.getData();\n            if (data == null) {\n                logger.warn(\"Received message data is null\");","sourceCodeStart":366,"sourceCodeEnd":402,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/client/src/main/java/com/alibaba/otter/canal/client/pulsarmq/PulsarMQCanalConnector.java#L366-L402","documentation":"Error \"mq get/ack not support concurrent & async ack\" thrown in alibaba/canal.","triggerScenarios":"Thrown at client/src/main/java/com/alibaba/otter/canal/client/pulsarmq/PulsarMQCanalConnector.java:384 when the library encounters an invalid state.","commonSituations":"Concurrent async ack on MQ connector. Serialize acks per batch or disable async ack in configuration; the underlying MQ client cannot correlate concurrent acknowledgements.","solutions":["Do not enable concurrent/async ack mode with the Pulsar MQ connector; call ack(batchId) synchronously after processing each batch.","Set the consumer to single-threaded get/ack processing or use flatMessage batch handling without async ack."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}