apache/shenyu · error · ShenyuAdminException

shenyu discovery start watcher need you has this key

Error message

shenyu discovery start watcher need you has this key %s in Discovery

What it means

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.

Solutions

  1. Ensure at least one instance/service is registered into the discovery for that key (register client/URI first) before creating the proxy selector
  2. Verify the discoveryHandlerDTO.listenerNode matches the registered service key
  3. Re-create the discovery handler with the correct listener node then retry selector creation

Example fix

// before
// no instance registered under /shenyu/sync/... key
processor.createProxySelector(handlerDTO, selectorDTO); // serviceExists(key)==false
// after
// client registers instance (key now exists), then:
processor.createProxySelector(handlerDTO, selectorDTO); // succeeds
Defensive patterns

Strategy: validation

Validate before calling

String key = buildProxySelectorKey(handlerDTO.getListenerNode());
if (!repository.serviceExists(key)) {
    throw new IllegalStateException("register an instance under key first: " + key);
}

Try / catch

try {
    processor.createProxySelector(handlerDTO, selectorDTO);
} catch (ShenyuAdminException e) {
    if (e.getMessage().contains("need you has this key")) { /* register instances, then retry */ }
}

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of apache/shenyu@567142e072 (2026-09-12). Data as JSON: /api/errors/c9a6adf27ec40622. Report an issue: GitHub.

Appendix: source

Thrown at shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java:60

    /**
     * DefaultDiscoveryProcessor.
     *
     * @param discoveryUpstreamMapper discoveryUpstreamMapper
     */
    public DefaultDiscoveryProcessor(final DiscoveryUpstreamMapper discoveryUpstreamMapper) {
        super(discoveryUpstreamMapper);
    }

    @Override
    public void createProxySelector(final DiscoveryHandlerDTO discoveryHandlerDTO, final ProxySelectorDTO proxySelectorDTO) {
        ShenyuInstanceRegisterRepository shenyuInstanceRegisterRepository = getShenyuDiscoveryService(discoveryHandlerDTO.getDiscoveryId());
        String key = buildProxySelectorKey(discoveryHandlerDTO.getListenerNode());
        if (Objects.isNull(shenyuInstanceRegisterRepository)) {
            throw new ShenyuAdminException(String.format("before start ProxySelector you need init DiscoveryId=%s", discoveryHandlerDTO.getDiscoveryId()));
        }

        if (!shenyuInstanceRegisterRepository.serviceExists(key)) {
            throw new ShenyuAdminException(String.format("shenyu discovery start watcher need you has this key %s in Discovery", key));
        }
        Set<String> cacheKey = getCacheKey(discoveryHandlerDTO.getDiscoveryId());
        if (Objects.nonNull(cacheKey) && cacheKey.contains(key)) {
            LOG.info("shenyu discovery has watcher key = {}", key);
            super.addDiscoverySyncDataListener(discoveryHandlerDTO, proxySelectorDTO);
            return;
        }
        final DataChangedEventListener discoveryDataChangedEventListener = getDiscoveryDataChangedEventListener(discoveryHandlerDTO, proxySelectorDTO);
        shenyuInstanceRegisterRepository.watchInstances(key, (selectKey, selectValue, event) -> {
            if (event.equals(ChangedEventListener.Event.ADDED)) {
                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.ADDED));
            } else if (event.equals(ChangedEventListener.Event.UPDATED)) {
                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.UPDATED));
            } else if (event.equals(ChangedEventListener.Event.DELETED)) {
                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.DELETED));
            } else {
                discoveryDataChangedEventListener.onChange(new DiscoveryDataChangedEvent(selectKey, selectValue, DiscoveryDataChangedEvent.Event.IGNORED));
            }

View on GitHub (pinned to 567142e072)