修复延迟基线bug

Timer改成线程池,修复系统时间改变导致定时任务无法执行的bug
This commit is contained in:
2026-09-29 20:10:57 +08:00
parent 100fad7d18
commit 862b860020
13 changed files with 260 additions and 202 deletions
@@ -17,14 +17,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
@@ -67,7 +61,7 @@ public class KLALBController {
public HighAccuracyClock getClock() {
return clock;
}
private final long TIME_WINDOW=2000000000L;
private final long TIME_WINDOW=50000000000L;
private SpeedAndTrafficMonitorDataImpl linkMonitor = new SpeedAndTrafficMonitorDataImpl(
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "up", 100,TIME_WINDOW ),
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW));
@@ -104,23 +98,9 @@ public class KLALBController {
public List<InetAddress> getDnsAddresses() {
return dnsAddresses;
}
private ScheduledExecutorService scheduleTimer=Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return ThreadTool.makeVDaemonThreadIfSupport("计时器线程", r);
}
});
public ScheduledExecutorService getScheduleTimer() {
return scheduleTimer;
}
private Timer twk = new Timer("网卡检测扫描计时器", true);
private TimerTask tsk1 = new TimerTask() {
private Runnable tsk1 = new Runnable() {
@Override
public void run() {
@@ -306,7 +286,7 @@ public class KLALBController {
return srv6Router.getLocator().getAddress().toInet6Address().equals(inetAddress);
}
private TimerTask tsk2 = new TimerTask() {
private Runnable tsk2 = new Runnable() {
@Override
public void run() {
@@ -734,8 +714,8 @@ public class KLALBController {
private void loadController() {
this.apiServer = new KLALBRoutingProtocolAPIServer(routingProtocol, this);
this.apiClient = new KLALBRoutingProtocolAPIClient(routingProtocol);
twk.schedule(tsk1, 5000, 5000);
twk.schedule(tsk2, 5000, 5000);
KLALBScheduler.getScheduler().scheduleAtFixedRate(tsk1, 5000, 5000,TimeUnit.MILLISECONDS);
KLALBScheduler.getScheduler().scheduleAtFixedRate(tsk2, 5000, 5000,TimeUnit.MILLISECONDS);
}
public KLALBController() {
@@ -753,17 +733,10 @@ public class KLALBController {
}
protected void initKLALB(boolean enableVirtualAdapter, IPv6AddressGroup selfg) {
ThreadTool.makeVDaemonThread("线路性能采样线程", ()->{
while(true) {
KLALBScheduler.getScheduler().scheduleAtFixedRate( ()->{
linkMonitor.update();
datatMonitor.update();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
},1,1,TimeUnit.MILLISECONDS);
loadSRv6ProtocolStack(selfg, enableVirtualAdapter);
loadController();
}
@@ -804,7 +777,7 @@ public class KLALBController {
List<MultiProtocolSocketAddress> linele = configItem.getExternalEndpoints();
if (linele != null) {
getExternalEndpoints().addAll(linele);
}
}
List<MultiProtocolSocketAddress> linetoc = configItem.getAutoConnections();
if (linetoc != null) {
linetoc.forEach((aline) -> {
@@ -856,9 +829,8 @@ public class KLALBController {
return srv6Router;
}
private Timer trtr = new Timer("路由表刷新计时器", true);
{
trtr.scheduleAtFixedRate(new TimerTask() {
KLALBScheduler.getScheduler().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
@@ -869,9 +841,9 @@ public class KLALBController {
srv6Router.updateRouteTabel();
}
}
}, 100, 100);
}, 100, 100, TimeUnit.MILLISECONDS);
trtr.scheduleAtFixedRate(new TimerTask() {
KLALBScheduler.getScheduler().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
@@ -880,7 +852,7 @@ public class KLALBController {
}
}
}, 10, 10);
}, 1, 1,TimeUnit.MILLISECONDS);
}
public IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet) {