{"record":{"id":"7c5ef74fdf1386d9","repo":"paascloud/paascloud-master","slug":"gl99990002-7c5ef7","errorCode":"GL99990002","errorMessage":"GL99990002","messagePattern":"GL99990002","errorType":"error_code","errorClass":"TpcBizException","httpStatus":null,"severity":"error","filePath":"paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/UacRpcService.java","lineNumber":62,"sourceCode":"\tpublic void batchUpdateTokenOffLine() {\n\t\tWrapper<Integer> wrapper = uacUserTokenFeignApi.updateTokenOffLine();\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"updateTokenOffLine 失败 result is null\");\n\t\t\treturn;\n\t\t}\n\t\tInteger result = wrapper.getResult();\n\t\tif (result == null || result == 0) {\n\t\t\tlog.error(\"updateTokenOffLine 失败\");\n\t\t} else {\n\t\t\tlog.error(\"updateTokenOffLine 成功\");\n\t\t}\n\t}\n\n\tpublic List<String> queryWaitingConfirmMessageKeyList(List<String> messageKeyList) {\n\t\tWrapper<List<String>> wrapper = uacMqMessageFeignApi.queryMessageKeyList(messageKeyList);\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"queryWaitingConfirmMessageKeyList 失败 result is null\");\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(MessageQueryDto messageQueryDto) {\n\t\tWrapper<PageInfo<MqMessageVo>> wrapper = uacMqMessageFeignApi.queryMessageListWithPage(messageQueryDto);\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"查询消息记录 失败 result is null\");\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper;\n\t}\n\n}","sourceCodeStart":44,"sourceCodeEnd":76,"githubUrl":"https://github.com/paascloud/paascloud-master/blob/781281a9503332ed3cef44ea618349d14230a127/paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/UacRpcService.java#L44-L76","documentation":"GL99990002 (platform generic remote-call-failure error) is thrown by UacRpcService.queryWaitingConfirmMessageKeyList when the Feign call to uacMqMessageFeignApi.queryMessageKeyList returns a null Wrapper. Because the code then calls wrapper.getResult() on success, a null envelope is rejected up-front with a TpcBizException rather than a NullPointerException.","triggerScenarios":"Calling queryWaitingConfirmConfirmMessageKeyList — i.e. UacRpcService.queryWaitingConfirmMessageKeyList(messageKeyList) — when uacMqMessageFeignApi.queryMessageKeyList returns null: UAC service unavailable, timed out, or its Feign fallback returned null.","commonSituations":"UAC service down during MQ message-confirmation processing; timeouts under load; UAC endpoint changed/renamed breaking the Feign contract; fallback methods returning null to 'soft fail'.","solutions":["Check UAC service health/registration and the Feign client's service name configuration.","Find the underlying Feign exception in logs that caused the null Wrapper (timeout, connect failure).","Stop returning null from Feign fallbacks; return an error Wrapper or throw so callers can distinguish failure from an empty key list.","Note an empty list is a valid result (all messages confirmed) — make sure fallbacks don't fake it; check wrapper.getResult() semantics.","Add retries with backoff for this confirm-polling path, and alert on sustained GL99990002 occurrences."],"exampleFix":"// before: null wrapper aborts the confirmation flow\nList<String> keys = uacRpcService.queryWaitingConfirmMessageKeyList(messageKeys);\n// after: handle RPC failure explicitly\nList<String> keys;\ntry {\n    keys = uacRpcService.queryWaitingConfirmMessageKeyList(messageKeys);\n} catch (TpcBizException e) {\n    log.warn(\"UAC unavailable, deferring confirmation of {} messages\", messageKeys.size(), e);\n    return; // retry on next poll\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    List<String> keys = uacRpcService.queryWaitingConfirmMessageKeyList(messageKeys);\n    confirm(keys);\n} catch (TpcBizException e) {\n    if (e.getCode() == 99990002L) {\n        log.warn(\"UAC unavailable — deferring message confirmation\");\n        return; // next polling cycle retries\n    }\n    throw e;\n}","preventionTips":["Return error Wrappers, never null, from Feign fallbacks.","Design confirmation polling to tolerate skipped cycles.","Health-check UAC before batch confirm jobs.","Distinguish empty list (all confirmed) from RPC failure in your logic.","Alert on repeated GL99990002 from the confirm flow — messages pile up unconfirmed."],"tags":["feign","rpc","mq"],"backgroundTag":"upstream-api-error","analyzedSha":"781281a9503332ed3cef44ea618349d14230a127","analyzedAt":"2026-09-10T10:59:02.070Z","contentChangedAt":"2026-09-10T10:59:02.070Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}