{"record":{"id":"c9a6adf27ec40622","repo":"apache/shenyu","slug":"shenyu-discovery-start-watcher-need-you-has-this-key-s-in","errorCode":null,"errorMessage":"shenyu discovery start watcher need you has this key %s in Discovery","messagePattern":"shenyu discovery start watcher need you has this key (.+?) in Discovery","errorType":"exception","errorClass":"ShenyuAdminException","httpStatus":null,"severity":"error","filePath":"shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java","lineNumber":60,"sourceCode":"    /**\n     * DefaultDiscoveryProcessor.\n     *\n     * @param discoveryUpstreamMapper discoveryUpstreamMapper\n     */\n    public DefaultDiscoveryProcessor(final DiscoveryUpstreamMapper discoveryUpstreamMapper) {\n        super(discoveryUpstreamMapper);\n    }\n\n    @Override\n    public void createProxySelector(final DiscoveryHandlerDTO discoveryHandlerDTO, final ProxySelectorDTO proxySelectorDTO) {\n        ShenyuInstanceRegisterRepository shenyuInstanceRegisterRepository = getShenyuDiscoveryService(discoveryHandlerDTO.getDiscoveryId());\n        String key = buildProxySelectorKey(discoveryHandlerDTO.getListenerNode());\n        if (Objects.isNull(shenyuInstanceRegisterRepository)) {\n            throw new ShenyuAdminException(String.format(\"before start ProxySelector you need init DiscoveryId=%s\", discoveryHandlerDTO.getDiscoveryId()));\n        }\n\n        if (!shenyuInstanceRegisterRepository.serviceExists(key)) {\n            throw new ShenyuAdminException(String.format(\"shenyu discovery start watcher need you has this key %s in Discovery\", key));\n        }\n        Set<String> cacheKey = getCacheKey(discoveryHandlerDTO.getDiscoveryId());\n        if (Objects.nonNull(cacheKey) && cacheKey.contains(key)) {\n            LOG.info(\"shenyu discovery has watcher key = {}\", key);\n            super.addDiscoverySyncDataListener(discoveryHandlerDTO, proxySelectorDTO);\n            return;\n        }\n        final DataChangedEventListener discoveryDataChangedEventListener = getDiscoveryDataChangedEventListener(discoveryHandlerDTO, proxySelectorDTO);\n        shenyuInstanceRegisterRepository.watchInstances(key, (selectKey, selectValue, event) -> {\n            if (event.equals(ChangedEventListener.Event.ADDED)) {\n                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.ADDED));\n            } else if (event.equals(ChangedEventListener.Event.UPDATED)) {\n                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.UPDATED));\n            } else if (event.equals(ChangedEventListener.Event.DELETED)) {\n                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.DELETED));\n            } else {\n                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.IGNORED));\n            }","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/apache/shenyu/blob/567142e07261b3e615ae8850b30f4421f455cc5d/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java#L42-L78","documentation":"After the repository is resolved, DefaultDiscoveryProcessor.createProxySelector checks shenyuInstanceRegisterRepository.serviceExists(key) for the proxy-selector key built from listenerNode; when the service/key is not registered in the discovery it throws this ShenyuAdminException — the watcher can only be started for keys present in the discovery.","triggerScenarios":"Creating a proxy selector whose listenerNode-built key has no registered service instance in the discovery repository (no backend instance registered yet, or the key/listener node doesn't match what was registered).","commonSituations":"Registering proxy selectors before any upstream instance registered itself into the discovery (e.g. no client registered the URI); namespace/key mismatch between discovery registration and selector listener node.","solutions":["Ensure at least one instance/service is registered into the discovery for that key (register client/URI first) before creating the proxy selector","Verify the discoveryHandlerDTO.listenerNode matches the registered service key","Re-create the discovery handler with the correct listener node then retry selector creation"],"exampleFix":"// before\n// no instance registered under /shenyu/sync/... key\nprocessor.createProxySelector(handlerDTO, selectorDTO); // serviceExists(key)==false\n// after\n// client registers instance (key now exists), then:\nprocessor.createProxySelector(handlerDTO, selectorDTO); // succeeds","handlingStrategy":"validation","validationCode":"String key = buildProxySelectorKey(handlerDTO.getListenerNode());\nif (!repository.serviceExists(key)) {\n    throw new IllegalStateException(\"register an instance under key first: \" + key);\n}","typeGuard":null,"tryCatchPattern":"try {\n    processor.createProxySelector(handlerDTO, selectorDTO);\n} catch (ShenyuAdminException e) {\n    if (e.getMessage().contains(\"need you has this key\")) { /* register instances, then retry */ }\n}","preventionTips":["Register at least one backend instance/URI before attaching proxy selectors","Keep listenerNode values consistent between discovery registration and selector config","Verify discovery watcher keys in the admin dashboard before automating selector creation"],"tags":["discovery","proxy-selector","service-registration"],"backgroundTag":"resource-not-found","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"}