fix(t17): 数据同步联调修复——群消息死循环 + 字段名 + schema自动升级 + maxGroups精确
联调(新疆信创测试应用 1600134460,租户sa 67群)发现并修复4类问题: 1.群消息死循环:group_msg_get_simple 的 IsFinished=2 表"还有更旧可拉",占位消息群恒为2; 原 oldestSeq=max(seq) 游标方向反,反复拉同一批致2217次/200s超时。 改 min(seq) 向旧翻页 + 游标未推进即停兜底 + 过滤 IsPlaceMsg=1 占位消息(119次/15.7s) 2.get_group_info 请求体字段名 GroupId→GroupIdList(腾讯要求 GroupIdList:["id"] 字符串数组) 3.运行库缺列致 upserted=0:init.sql 仅新建库执行,新增 SchemaUpgradeBootstrap 启动幂等ALTER(6条DDL) 4.maxGroups 防护:break 由 for 外移入 for 内,精确限制避免单页海量群绕过上限 联调验证(租户sa 67群):群组67/67、群成员241/13、群消息119次/imported=3,死循环消除 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package com.imutil.task;
|
||||
|
||||
import com.imutil.mapper.PartitionMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.noear.solon.annotation.Component;
|
||||
import org.noear.solon.annotation.Init;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
|
||||
/**
|
||||
* 数据库 Schema 启动自动升级(幂等)
|
||||
* <p>
|
||||
* 解决"实体加字段但运行库未 ALTER"问题:init.sql 仅新建库时执行,老库不会自动加列,
|
||||
* 导致 MyBatis insert/update 到新列时报 column 不存在。启动时对增量列执行
|
||||
* ADD COLUMN IF NOT EXISTS,老库自动补列,新库重复执行也无副作用。
|
||||
*
|
||||
* @author imutil
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class SchemaUpgradeBootstrap {
|
||||
|
||||
@Inject
|
||||
private PartitionMapper partitionMapper;
|
||||
|
||||
@Init
|
||||
public void init() {
|
||||
// T17: group_mapping/user_mapping 同步资料列
|
||||
String[] ddls = {
|
||||
"ALTER TABLE group_mapping ADD COLUMN IF NOT EXISTS name varchar(256)",
|
||||
"ALTER TABLE group_mapping ADD COLUMN IF NOT EXISTS owner_account varchar(128)",
|
||||
"ALTER TABLE group_mapping ADD COLUMN IF NOT EXISTS member_count int",
|
||||
"ALTER TABLE group_mapping ADD COLUMN IF NOT EXISTS last_synced_at timestamptz",
|
||||
"ALTER TABLE user_mapping ADD COLUMN IF NOT EXISTS nick varchar(128)",
|
||||
"ALTER TABLE user_mapping ADD COLUMN IF NOT EXISTS last_synced_at timestamptz",
|
||||
};
|
||||
int ok = 0;
|
||||
for (String sql : ddls) {
|
||||
try {
|
||||
partitionMapper.execute(sql);
|
||||
ok++;
|
||||
} catch (Exception e) {
|
||||
log.warn("schema升级跳过 [{}] : {}", sql, e.getMessage());
|
||||
}
|
||||
}
|
||||
log.info("启动 schema 升级完成({}/{} 条 DDL)", ok, ddls.length);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user