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
- 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
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
- 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
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
- before start ProxySelector you need init DiscoveryId=
- before start ProxySelector you need init DiscoveryId=
- shenyu discovery mode current didn't support
- when binding discovery don't find selector
- shenyu this discovery has discoveryHandler can't be delete
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)