netty 集群网络游戏服务器框架 ioGame 17.1.60 action 业务线程监控插件
主要更新
#227 增加调度、定时器相关便捷工具,使用 HashedWheelTimer 来模拟 ScheduledExecutorService 调度
public void test() {
// 每分钟调用一次
TaskKit.runIntervalMinute(() -> log.info("tick 1 Minute"), 1);
// 每 2 分钟调用一次
TaskKit.runIntervalMinute(() -> log.info("tick 2 Minute"), 2);
// 每 2 秒调用一次
TaskKit.runInterval(() -> log.info("tick 2 Seconds"), 2, TimeUnit.SECONDS);
// 每 30 分钟调用一次
TaskKit.runInterval(() -> log.info("tick 30 Minute"), 30, TimeUnit.MINUTES);
//【示例 - 移除任务】每秒调用一次,当 hp 为 0 时就移除当前 TimerListener
TaskKit.runInterval(new IntervalTaskListener() {
int hp = 2;
@Override
public void onUpdate() {
hp--;
log.info("剩余 hp:2-{}", hp);
}
@Override
public boolean isActive() {
// 当返回 false 则表示不活跃,会从监听列表中移除当前 TimerListener
return hp != 0;
}
}, 1, TimeUnit.SECONDS);
//【示例 - 跳过执行】每秒调用一次,当 triggerUpdate 返回值为 true,即符合条件时才执行 onUpdate 方法
TaskKit.runInterval(new IntervalTaskListener() {
int hp;
@Override
public void onUpdate() {
log.info("current hp:{}", hp);
}
@Override
public boolean triggerUpdate() {
hp++;
// 当返回值为 true 时,会执行 onUpdate 方法
return hp % 2 == 0;
}
}, 1, TimeUnit.SECONDS);
//【示例 - 指定线程执行器】每秒调用一次
// 如果有耗时的任务,比如涉及一些 io 操作的,建议指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
ExecutorService executorService = TaskKit.getCacheExecutor();
TaskKit.runInterval(new IntervalTaskListener() {
@Override
public void onUpdate() {
log.info("执行耗时的 IO 任务,开始");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("执行耗时的 IO 任务,结束");
}
@Override
public Executor getExecutor() {
// 指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
return executorService;
}
}, 1, TimeUnit.SECONDS);
TimeUnit.SECONDS.sleep(20);
}
#225 新增插件 - 业务线程监控
详细文档 https://www.yuque.com/iohao/game/zoqabk4gez3bckis
BarSkeletonBuilder builder = ...;
// 业务线程监控插件,将插件添加到业务框架中
var threadMonitorInOut = new ThreadMonitorInOut();
builder.addInOut(threadMonitorInOut);
打印预览
业务线程[RequestMessage-8-1] 共执行了 1 次业务,平均耗时 1 ms, 剩余 91 个任务未执行
业务线程[RequestMessage-8-2] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
业务线程[RequestMessage-8-3] 共执行了 1 次业务,平均耗时 1 ms, 剩余 36 个任务未执行
业务线程[RequestMessage-8-4] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
业务线程[RequestMessage-8-5] 共执行了 1 次业务,平均耗时 1 ms, 剩余 88 个任务未执行
业务线程[RequestMessage-8-6] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
业务线程[RequestMessage-8-7] 共执行了 7 次业务,平均耗时 1 ms, 剩余 56 个任务未执行
业务线程[RequestMessage-8-8] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
其他更新
废废弃 InternalKit,使用 TaskKit 代替
HeadMetadata 新增 cloneAll 方法
增加 ThreadExecutorRegion 线程执行器管理域接口;
- 新增 UserThreadExecutorRegion 实现,执行器具体数量是不大于 Runtime.getRuntime().availableProcessors() 的 2 次幂。
- 新增 SimpleThreadExecutorRegion 实现,执行器的数量与 Runtime.getRuntime().availableProcessors() 相同。
默认为 UserThreadExecutorRegion 和 SimpleThreadExecutorRegion 提供了单例实现,即使在同一进程中启动了多个逻辑服,也不会创建过多线程执行器,而是使用同一个。