{"record":{"id":"9ec68ed747df48b0","repo":"alibaba/canal","slug":"should-connect-first","errorCode":null,"errorMessage":"should connect first","messagePattern":"should connect first","errorType":"exception","errorClass":"CanalClientException","httpStatus":null,"severity":"error","filePath":"client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java","lineNumber":469,"sourceCode":"                    }\n\n                    return address;\n                }\n\n                public void processActiveExit() {\n                    mutex.set(false);\n                    doDisconnect();\n                }\n\n            });\n        }\n    }\n\n    private void waitClientRunning() {\n        try {\n            if (zkClientx != null) {\n                if (!connected) {// 未调用connect\n                    throw new CanalClientException(\"should connect first\");\n                }\n\n                running = true;\n                mutex.get();// 阻塞等待\n            } else {\n                // 单机模式直接设置为running\n                running = true;\n            }\n        } catch (InterruptedException e) {\n            Thread.currentThread().interrupt();\n            throw new CanalClientException(e);\n        }\n    }\n\n    public boolean checkValid() {\n        if (zkClientx != null) {\n            return mutex.state();\n        } else {","sourceCodeStart":451,"sourceCodeEnd":487,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java#L451-L487","documentation":"Error \"should connect first\" thrown in alibaba/canal.","triggerScenarios":"Thrown at client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java:469 when the library encounters an invalid state.","commonSituations":"Operation attempted before connect(). Guard every public method with a connected-state check and fail fast instead of issuing IO on a null channel.","solutions":["Call connect() (and subscribe() where required) before calling get/getWithoutAck/ack/rollback.","Guard consumption with connector state checks or use the recommended connect-subscribe-get-ack loop pattern from canal examples."],"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"}