@Override
    @SuppressWarnings("unchecked")
    public void onApplicationEvent(@NotNull final DataChangedEvent event) {
        for (DataChangedListener listener : listeners) {
            if (!(listener instanceof AbstractDataChangedListener)
                    && clusterProperties.isEnabled()
                    && Objects.nonNull(shenyuClusterSelectMasterService)
                    && !shenyuClusterSelectMasterService.isMaster()) {
                LOG.info("received DataChangedEvent, not master, pass");
                return;
            }
            LOG.info("received DataChangedEvent, dispatching, event:{}", JsonUtils.toJson(event));
            switch (event.getGroupKey()) {
                case APP_AUTH:
                    listener.onAppAuthChanged((List<AppAuthData>) event.getSource(), event.getEventType());
                    break;
                case PLUGIN:
                    listener.onPluginChanged((List<PluginData>) event.getSource(), event.getEventType());
                    break;
                case RULE:
                    listener.onRuleChanged((List<RuleData>) event.getSource(), event.getEventType());
                    break;
                case SELECTOR:
                    listener.onSelectorChanged((List<SelectorData>) event.getSource(), event.getEventType());
                    break;
                case META_DATA:
                    listener.onMetaDataChanged((List<MetaData>) event.getSource(), event.getEventType());
                    break;
                case PROXY_SELECTOR:
                    listener.onProxySelectorChanged((List<ProxySelectorData>) event.getSource(), event.getEventType());
                    break;
                case DISCOVER_UPSTREAM:
                    listener.onDiscoveryUpstreamChanged((List<DiscoverySyncData>) event.getSource(), event.getEventType());
                    applicationContext.getBean(LoadServiceDocEntry.class).loadDocOnUpstreamChanged((List<DiscoverySyncData>) event.getSource(), event.getEventType());
                    break;
                default:
                    throw new IllegalStateException("Unexpected value: " + event.getGroupKey());
            }
        }
    }
Event forwarders, which forward the changed events to each ConfigEventListener.
shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/DataChangedEventDispatcher.java