fix(databus): 修复客户端消息处理和防止消息循环

1. 修复消息格式不匹配问题
   - 增量消息:兼容 SyncMessage 格式,从 dataSnapshot 字段反序列化数据
   - 批量消息:添加 getDataType() 方法获取泛型类型,正确转换 JSONObject

2. 防止消息循环
   - 添加 zt.databus.change.producer.enabled 配置项
   - 客户端禁用变更消息发送,避免 客户端写入 → 发送变更 → 循环

3. 修复 Feign 客户端注入
   - 在 RpcConfiguration 中添加 DeptApi、PostApi
   - 确保客户端能通过 Feign 调用本地 system-server API

相关文件:
- DatabusClientConsumer.java: 修复消息解析逻辑
- BatchSyncEventHandler.java: 添加 getDataType() 方法
- DatabusChangeProducer.java: 添加 enabled 开关
- RpcConfiguration.java: 启用 DeptApi/PostApi Feign 客户端

Ref: 修复 ClassCastException 和消息循环问题
This commit is contained in:
hewencai
2025-12-03 11:10:57 +08:00
parent adf3ec601a
commit 6ac4a356cd
37 changed files with 659 additions and 41 deletions

View File

@@ -238,10 +238,13 @@ public enum DatabusEventType {
/**
* 获取完整Topic名称服务端转发用
* 格式: {topicBase}-{module}-{entity}-{action}-{clientCode}
* 格式: {topicBase}-{clientCode}(简化版,所有事件共用一个 Topic
* 示例: databus-sync-branch-001
*
* 注意:不再为每个事件创建独立 Topic而是通过消息体中的 eventType 字段路由
*/
public String getTopic(String topicBase, String clientCode) {
return String.format("%s-%s-%s-%s-%s", topicBase, module, entity, action, clientCode);
return String.format("%s-%s", topicBase, clientCode);
}
/**
@@ -270,6 +273,31 @@ public enum DatabusEventType {
return null;
}
/**
* 根据事件类型字符串获取枚举(支持大写下划线格式)
* 例如SYSTEM_POST_FULL → DatabusEventType.SYSTEM_POST_FULL
*
* @param eventType 事件类型字符串(格式: MODULE_ENTITY_ACTION
* @return 枚举值未找到返回null
*/
public static DatabusEventType getByEventType(String eventType) {
if (eventType == null) {
return null;
}
// 先尝试直接匹配枚举名称
try {
return DatabusEventType.valueOf(eventType.toUpperCase());
} catch (IllegalArgumentException e) {
// 如果失败,尝试转换格式后匹配(如 system-post-full → SYSTEM_POST_FULL
String normalized = eventType.toUpperCase().replace("-", "_");
try {
return DatabusEventType.valueOf(normalized);
} catch (IllegalArgumentException ex) {
return null;
}
}
}
/**
* 根据模块、实体、操作获取枚举
*