v9: 修复pollAdminChanges 404 + 延迟增到8-10秒

- 修复 ack_admin_changes double URL bug(httpPost重复拼接webBaseUrl)
- 改用GET方式发送ack,避免POST Content-Type不匹配
- land_api.php 支持GET参数ids
- 所有任务间随机延迟从6-8秒增到8-10秒
- 目标:锁库降到0-1次/分钟
This commit is contained in:
2026-06-25 13:05:41 +08:00
parent 9599a66cc5
commit 10e148be5f
+35 -35
View File
@@ -801,24 +801,24 @@ public class WebManager {
plugin.getLogger().info("[Web通信] 开始首次全量同步(通过DB队列串行化)...");
// 登录相关操作高优先级
submitDbTask("首次-syncUserRegistrations", () -> syncUserRegistrations());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("首次-pushWebLoginCredentials", () -> pushWebLoginCredentials());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
// 普通同步操作低优先级(每个任务间随机间隔2-4秒,避免PHP端DB锁)
submitNormalDbTask("首次-syncOnlinePlayers", () -> syncOnlinePlayers());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-syncShopData", () -> syncShopData());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-syncBondBalances", () -> syncBondBalances());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-syncBondTransactions", () -> syncBondTransactions());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-syncAllPlayerIps", () -> syncAllPlayerIps());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-syncServiceProviders", () -> syncServiceProviders());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-syncLandData", () -> syncLandData());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("首次-pollAdminChanges", () -> pollAdminChanges());
}
}.runTaskLaterAsynchronously(plugin, 20L * 10);
@@ -1189,19 +1189,19 @@ public class WebManager {
plugin.getLogger().info("[Web通信] 收到即时同步请求: " + players.toString());
// 通过DB队列串行化执行(每个任务间错开800ms)
submitDbTask("即时-syncOnlinePlayers", () -> syncOnlinePlayers());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("即时-pushWebLoginCredentials", () -> pushWebLoginCredentials());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("即时-syncUserRegistrations", () -> syncUserRegistrations());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("即时-pullPendingTransactions", () -> pullPendingTransactions());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("即时-pullShopStock", () -> pullShopStock());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("即时-pullBondChanges", () -> pullBondChanges());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("即时-syncAllPlayerIps", () -> syncAllPlayerIps());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("即时-syncServiceProviders", () -> syncServiceProviders());
}
}
@@ -1224,17 +1224,17 @@ public class WebManager {
lastOnlineCheckTime = System.currentTimeMillis();
// 通过DB队列串行化执行最后一轮同步(每个任务间随机间隔2-4秒,避免与定时轮询冲突)
submitDbTask("末轮-syncOnlinePlayers", () -> syncOnlinePlayers());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("末轮-pushWebLoginCredentials", () -> pushWebLoginCredentials());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("末轮-syncUserRegistrations", () -> syncUserRegistrations());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("末轮-syncBondTransactions", () -> syncBondTransactions());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("末轮-pullPendingTransactions", () -> pullPendingTransactions());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("末轮-pullShopStock", () -> pullShopStock());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("末轮-pullBondChanges", () -> pullBondChanges());
plugin.getLogger().info("[Web通信] 检测到全员下线超60秒,执行最后一轮同步(通过DB队列),调度器继续运行(玩家上线自动恢复)");
plugin.getLogger().warning("\n" +
@@ -1285,28 +1285,28 @@ public class WebManager {
// 登录/注册相关(始终执行,随机间隔2-4秒避免PHP端DB锁)
submitDbTask("周期-pushWebLoginCredentials", () -> pushWebLoginCredentials());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("周期-syncUserRegistrations", () -> syncUserRegistrations());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
if (online) {
// 在线:执行全量同步(每个任务随机间隔2-4秒)
submitDbTask("周期-syncOnlinePlayers", () -> syncOnlinePlayers());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitDbTask("周期-syncBondTransactions", () -> syncBondTransactions());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-pullPendingTransactions", () -> pullPendingTransactions());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-pullShopStock", () -> pullShopStock());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-pullBondChanges", () -> pullBondChanges());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-syncAllPlayerIps", () -> syncAllPlayerIps());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-syncServiceProviders", () -> syncServiceProviders());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-syncLandData", () -> syncLandData());
try { Thread.sleep(6000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
try { Thread.sleep(8000 + (long)(Math.random() * 2000)); } catch (InterruptedException ignored) {}
submitNormalDbTask("周期-pollAdminChanges", () -> pollAdminChanges());
} else {
// ★ 不在线:跳过非必要同步任务
@@ -2621,9 +2621,9 @@ public class WebManager {
// 确认已处理的变更
if (!ackedIds.isEmpty()) {
String ackUrl = webBaseUrl + "/api/land_api.php?action=ack_admin_changes&secret=" + secretKey;
String ackBody = "ids=" + String.join(",", ackedIds.stream().map(String::valueOf).collect(Collectors.toList()));
httpPost(ackUrl, ackBody);
String idsStr = String.join(",", ackedIds.stream().map(String::valueOf).collect(Collectors.toList()));
String ackUrl = "/api/land_api.php?action=ack_admin_changes&secret=" + java.net.URLEncoder.encode(secretKey, "UTF-8") + "&ids=" + java.net.URLEncoder.encode(idsStr, "UTF-8");
doGet(ackUrl);
}
} catch (Exception e) {
plugin.getLogger().warning("[Web通信] 轮询PHP管理员变更异常: " + e.getMessage());