{"record":{"id":"a163ed2bbdd7242d","repo":"alibaba/arthas","slug":"consumerid-is-required","errorCode":null,"errorMessage":"'consumerId' is required","messagePattern":"'consumerId' is required","errorType":"http","errorClass":"ApiException","httpStatus":200,"severity":"error","filePath":"core/src/main/java/com/taobao/arthas/core/shell/term/impl/http/api/HttpApiHandler.java","lineNumber":494,"sourceCode":"        Map<String, Object> body = new TreeMap<String, Object>();\n        body.put(\"jobId\", job.id());\n        body.put(\"jobStatus\", job.status());\n        return new ApiResponse()\n                .setState(ApiState.SUCCEEDED)\n                .setBody(body);\n    }\n\n    /**\n     * Pull results from result queue\n     *\n     * @param apiRequest\n     * @param session\n     * @return\n     */\n    private ApiResponse processPullResultsRequest(ApiRequest apiRequest, Session session) throws ApiException {\n        String consumerId = apiRequest.getConsumerId();\n        if (StringUtils.isBlank(consumerId)) {\n            throw new ApiException(\"'consumerId' is required\");\n        }\n        ResultConsumer consumer = null;\n        SharingResultDistributor resultDistributor = session.getResultDistributor();\n        if (resultDistributor != null) {\n            consumer = resultDistributor.getConsumer(consumerId);\n        }\n        if (consumer == null) {\n            throw new ApiException(\"consumer not found: \" + consumerId);\n        }\n\n        List<ResultModel> results = consumer.pollResults();\n        Map<String, Object> body = new TreeMap<String, Object>();\n        body.put(\"results\", results);\n\n        ApiResponse response = new ApiResponse();\n        response.setState(ApiState.SUCCEEDED)\n                .setSessionId(session.getSessionId())\n                .setConsumerId(consumerId)","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/alibaba/arthas/blob/21cf2e9ba52b305290be7223b980ff504bb9cb5b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/http/api/HttpApiHandler.java#L476-L512","documentation":"Thrown by processPullResultsRequest when the 'consumerId' field is blank. Pulling results requires a consumerId (obtained during INIT_SESSION or JOIN_SESSION) to identify which result consumer's queue to poll. Without it Arthas cannot locate the result stream.","triggerScenarios":"Calling PULL_RESULTS without a consumerId in the request body, or with consumerId set to empty string.","commonSituations":"Client forgets to store the consumerId returned by INIT_SESSION/JOIN_SESSION. New client integration that omits the field.","solutions":["Capture the consumerId from the INIT_SESSION or JOIN_SESSION response and include it in every PULL_RESULTS request.","Ensure the JSON key is exactly 'consumerId' (case-sensitive)."],"exampleFix":"// before\n{\"action\": \"pull_results\", \"sessionId\": \"<sid>\"}\n// -> 'consumerId' is required\n\n// after\n{\"action\": \"pull_results\", \"sessionId\": \"<sid>\", \"consumerId\": \"<from init_session>\"}","handlingStrategy":"validation","validationCode":"// Client-side: ensure consumerId is present for PULL_RESULTS\nif (\"PULL_RESULTS\".equalsIgnoreCase(action) &&\n        (consumerId == null || consumerId.trim().isEmpty())) {\n    throw new IllegalArgumentException(\"'consumerId' is required for PULL_RESULTS\");\n}","typeGuard":"boolean hasConsumerId(ApiRequest req) {\n    String c = req.getConsumerId();\n    return c != null && !c.trim().isEmpty();\n}","tryCatchPattern":null,"preventionTips":["Capture the consumerId from INIT_SESSION/JOIN_SESSION responses.","Include consumerId in every PULL_RESULTS request.","Use the exact key 'consumerId' (case-sensitive)."],"tags":["http-api","consumer","request-validation"],"backgroundTag":null,"analyzedSha":"21cf2e9ba52b305290be7223b980ff504bb9cb5b","analyzedAt":"2026-08-14T00:57:07.243Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}