Aias00 commented on code in PR #7330:
URL: https://github.com/apache/shenyu/pull/7330#discussion_r4117791440
##########
shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/websocket/WebsocketDataChangedListener.java:
##########
@@ -44,176 +51,67 @@
*/
public class WebsocketDataChangedListener implements DataChangedListener {
+ private static final Logger LOG =
LoggerFactory.getLogger(WebsocketDataChangedListener.class);
+
@Override
- public void onPluginChanged(
- final List<PluginData> pluginDataList, final DataEventTypeEnum
eventType) {
- WebsocketData<PluginData> websocketData =
- new WebsocketData<>(
- ConfigGroupEnum.PLUGIN.name(), eventType.name(),
pluginDataList);
- if (CollectionUtils.isNotEmpty(pluginDataList)) {
- String namespaceId =
- pluginDataList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId,
GsonUtils.getInstance().toJson(websocketData), eventType);
- }
+ public void onPluginChanged(final List<PluginData> pluginDataList, final
DataEventTypeEnum eventType) {
+ sendByNamespace(pluginDataList, eventType, ConfigGroupEnum.PLUGIN,
PluginData::getNamespaceId);
}
@Override
- public void onSelectorChanged(
- final List<SelectorData> selectorDataList, final DataEventTypeEnum
eventType) {
- WebsocketData<SelectorData> websocketData =
- new WebsocketData<>(
- ConfigGroupEnum.SELECTOR.name(), eventType.name(),
selectorDataList);
- if (CollectionUtils.isNotEmpty(selectorDataList)) {
- String namespaceId =
- selectorDataList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId,
GsonUtils.getInstance().toJson(websocketData), eventType);
- }
+ public void onSelectorChanged(final List<SelectorData> selectorDataList,
final DataEventTypeEnum eventType) {
+ sendByNamespace(selectorDataList, eventType, ConfigGroupEnum.SELECTOR,
SelectorData::getNamespaceId);
}
@Override
- public void onRuleChanged(
- final List<RuleData> ruleDataList, final DataEventTypeEnum
eventType) {
- WebsocketData<RuleData> configData =
- new WebsocketData<>(ConfigGroupEnum.RULE.name(),
eventType.name(), ruleDataList);
- if (CollectionUtils.isNotEmpty(ruleDataList)) {
- String namespaceId =
- ruleDataList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId, GsonUtils.getInstance().toJson(configData),
eventType);
- }
+ public void onRuleChanged(final List<RuleData> ruleDataList, final
DataEventTypeEnum eventType) {
+ sendByNamespace(ruleDataList, eventType, ConfigGroupEnum.RULE,
RuleData::getNamespaceId);
}
@Override
- public void onAppAuthChanged(
- final List<AppAuthData> appAuthDataList, final DataEventTypeEnum
eventType) {
- WebsocketData<AppAuthData> configData =
- new WebsocketData<>(
- ConfigGroupEnum.APP_AUTH.name(), eventType.name(),
appAuthDataList);
- if (CollectionUtils.isNotEmpty(appAuthDataList)) {
- String namespaceId =
- appAuthDataList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId, GsonUtils.getInstance().toJson(configData),
eventType);
- }
+ public void onAppAuthChanged(final List<AppAuthData> appAuthDataList,
final DataEventTypeEnum eventType) {
+ sendByNamespace(appAuthDataList, eventType, ConfigGroupEnum.APP_AUTH,
AppAuthData::getNamespaceId);
}
@Override
- public void onMetaDataChanged(
- final List<MetaData> metaDataList, final DataEventTypeEnum
eventType) {
- WebsocketData<MetaData> configData =
- new WebsocketData<>(
- ConfigGroupEnum.META_DATA.name(), eventType.name(),
metaDataList);
- if (CollectionUtils.isNotEmpty(metaDataList)) {
- String namespaceId =
- metaDataList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId, GsonUtils.getInstance().toJson(configData),
eventType);
- }
+ public void onMetaDataChanged(final List<MetaData> metaDataList, final
DataEventTypeEnum eventType) {
+ sendByNamespace(metaDataList, eventType, ConfigGroupEnum.META_DATA,
MetaData::getNamespaceId);
}
@Override
- public void onProxySelectorChanged(
- final List<ProxySelectorData> proxySelectorDataList,
- final DataEventTypeEnum eventType) {
- WebsocketData<ProxySelectorData> configData =
- new WebsocketData<>(
- ConfigGroupEnum.PROXY_SELECTOR.name(),
- eventType.name(),
- proxySelectorDataList);
- if (CollectionUtils.isNotEmpty(proxySelectorDataList)) {
- String namespaceId =
- proxySelectorDataList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId, GsonUtils.getInstance().toJson(configData),
eventType);
- }
+ public void onProxySelectorChanged(final List<ProxySelectorData>
proxySelectorDataList, final DataEventTypeEnum eventType) {
+ sendByNamespace(proxySelectorDataList, eventType,
ConfigGroupEnum.PROXY_SELECTOR, ProxySelectorData::getNamespaceId);
}
@Override
- public void onAiProxyApiKeyChanged(
- final List<ProxyApiKeyData> changed, final DataEventTypeEnum
eventType) {
- WebsocketData<ProxyApiKeyData> configData =
- new WebsocketData<>(
- ConfigGroupEnum.AI_PROXY_API_KEY.name(),
eventType.name(), changed);
- if (CollectionUtils.isNotEmpty(changed)) {
- String namespaceId =
- changed.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId, GsonUtils.getInstance().toJson(configData),
eventType);
- }
+ public void onAiProxyApiKeyChanged(final List<ProxyApiKeyData> changed,
final DataEventTypeEnum eventType) {
+ sendByNamespace(changed, eventType, ConfigGroupEnum.AI_PROXY_API_KEY,
ProxyApiKeyData::getNamespaceId);
}
@Override
- public void onDiscoveryUpstreamChanged(
- final List<DiscoverySyncData> discoveryUpstreamList,
- final DataEventTypeEnum eventType) {
- WebsocketData<DiscoverySyncData> configData =
- new WebsocketData<>(
- ConfigGroupEnum.DISCOVER_UPSTREAM.name(),
- eventType.name(),
- discoveryUpstreamList);
- if (CollectionUtils.isNotEmpty(discoveryUpstreamList)) {
- String namespaceId =
- discoveryUpstreamList.stream()
- .map(
- value ->
- StringUtils.defaultString(
- value.getNamespaceId(),
- SYS_DEFAULT_NAMESPACE_ID))
- .findFirst()
- .get();
- WebsocketCollector.send(
- namespaceId, GsonUtils.getInstance().toJson(configData),
eventType);
+ public void onDiscoveryUpstreamChanged(final List<DiscoverySyncData>
discoveryUpstreamList, final DataEventTypeEnum eventType) {
+ sendByNamespace(discoveryUpstreamList, eventType,
ConfigGroupEnum.DISCOVER_UPSTREAM, DiscoverySyncData::getNamespaceId);
+ }
+
+ private <T> void sendByNamespace(final List<T> changed, final
DataEventTypeEnum eventType,
+ final ConfigGroupEnum group, final
Function<T, String> namespaceOf) {
+ if (CollectionUtils.isEmpty(changed)) {
+ return;
+ }
+ Map<String, List<T>> byNamespace = new LinkedHashMap<>();
+ for (T item : changed) {
+ if (Objects.isNull(item)) {
Review Comment:
Non-blocking: silently skipping a null element here means a producer bug
turns into "one config entry quietly never delivered". A `LOG.warn` (or an
assertion) would make that visible in the admin log instead of surfacing much
later as a stale gateway.
Same for the level of the `LOG.info` below — it fires once per namespace per
event, and `WebsocketCollector.send` already logs the payload at `info`
(`WebsocketCollector.java:294`), so this is largely duplicative. `debug` would
keep the signal-to-noise ratio sane on large fan-outs.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]