{"record":{"id":"c018f6239128f547","repo":"apache/shenyu","slug":"accesstoken-is-null-heartbeatlistener","errorCode":null,"errorMessage":"accessToken is null","messagePattern":"accessToken is null","errorType":"exception","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"shenyu-register-center/shenyu-register-client-beat/src/main/java/org/apache/shenyu/register/client/beat/HeartbeatListener.java","lineNumber":122,"sourceCode":"            instanceBeatInfoDTO.setInstancePort(String.valueOf(serverProperties.getPort()));\n            instanceBeatInfoDTO.setInstanceIp(IpUtils.getHost());\n            instanceBeatInfoDTO.setNamespaceId(shenyuConfig.getNamespace());\n            instanceBeatInfoDTO.setInstanceInfo(SystemInfoUtils.getSystemInfo());\n            instanceBeatInfoDTO.setInstanceType(InstanceTypeConstants.BOOTSTRAP_INSTANCE_INFO);\n            sendHeartbeat(instanceBeatInfoDTO);\n            }, INITIAL_DELAY, CHECK_PERIOD, TimeUnit.SECONDS\n        );\n    }\n\n    private void sendHeartbeat(final InstanceBeatInfoDTO instanceBeatInfoDTO) {\n        int i = 0;\n        for (String server : serverList) {\n            i++;\n            String concat = server.concat(Constants.BEAT_URI_PATH);\n            try {\n                String accessToken = this.accessToken.get(server);\n                if (StringUtils.isBlank(accessToken)) {\n                    throw new NullPointerException(\"accessToken is null\");\n                }\n                RegisterUtils.doHeartBeat(GsonUtils.getInstance().toJson(instanceBeatInfoDTO), concat, Constants.HEARTBEAT, accessToken);\n            } catch (Exception e) {\n                LOG.error(\"HeartBeat admin url :{} is fail, will retry.\", server, e);\n                if (i == serverList.size()) {\n                    throw new RuntimeException(e);\n                }\n            }\n        }\n    }\n\n    @EventListener(ContextClosedEvent.class)\n    public void onShutdown() {\n        executor.shutdown();\n        try {\n            if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {\n                executor.shutdownNow();\n            }","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/apache/shenyu/blob/567142e07261b3e615ae8850b30f4421f455cc5d/shenyu-register-center/shenyu-register-client-beat/src/main/java/org/apache/shenyu/register/client/beat/HeartbeatListener.java#L104-L140","documentation":"HeartbeatListener.sendHeartbeat sends instance beat info to each admin server with a cached access token; a blank token for a server throws NullPointerException. The token is populated by the listener's auth/login flow, so its absence means that admin node was never authenticated.","triggerScenarios":"The heartbeat task fires (from the HeartbeatListener constructor/scheduler) before or without a successful token fetch for that server URL in serverLists.","commonSituations":"Wrong register credentials; admin node down at client startup so login never stored a token; network partition; race between first heartbeat tick and login completion.","solutions":["Verify shenyu.register credentials and serverLists are correct","Check logs for the token/login failure for that admin URL","Restart the client so authentication completes before heartbeating","Ensure the admin node is reachable from the client host"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"String t = accessToken.get(server); if (t == null || t.isEmpty()) { reLogin(server); }","typeGuard":null,"tryCatchPattern":"try { listener.sendHeartbeat(beatInfo); } catch (RuntimeException e) { LOG.error(\"heartbeat failed; will re-auth and retry\", e); }","preventionTips":["Start heartbeat scheduling after the token callback fires","Validate register credentials at client startup","Alert on repeated heartbeat failures per admin node"],"tags":["heartbeat","register-client","authentication"],"backgroundTag":"missing-credentials","analyzedSha":"567142e07261b3e615ae8850b30f4421f455cc5d","analyzedAt":"2026-09-12T10:08:21.293Z","contentChangedAt":"2026-09-12T10:08:21.293Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}