iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
834 stars 183 forks source link

[内置 kit] 轻量可控的延时任务 #291

Open iohao opened 3 months ago

iohao commented 3 months ago

新增功能的使用场景

TaskKit 介绍

我们知道,在 TaskKit (yuque.com) 中,提供了一个任务、时间、延时监听、超时监听...等,相结合的一个工具模块。

通过 runOnce 可以执行一些延时任务,如下所示。

// 只执行一次,2 秒后执行 
TaskKit.runOnce(() -> log.info("2 Seconds"), 2, TimeUnit.SECONDS); 
// 只执行一次,1 分钟后执行 
TaskKit.runOnce(() -> log.info("1 Minute"), 1, TimeUnit.MINUTES)

但有时,我们需要一些可控的延时任务;就是延时的时间可以根据后续的业务来变化(比如,增加延时时间、减少延时时间、取消延时任务 ...等)。


轻量可控的延时任务简介

轻量可控的延时任务 - 特点

// 伪代码如下
public void test() {
  // 创建轻量可控的延时任务,并设置任务监听回调,当延时任务触发时会执行该回调
  DelayTask delayTask = TaskKit.ofDelayTask(() -> log.info("hello DelayTask"))
                // N 秒后触发
                .addTime(Duration.ofSeconds(1))
                // 启动任务
                .task();

  delayTask.addTimeMillis(500); // 增加 0.5 秒的延时时间
  delayTask.addTimeMillis(-500); // 减少 0.5 秒的延时时间
  delayTask.cancel(); // 取消任务
}

轻量可控的延时任务 - 业务使用场景

以上两个业务场景,大体想描述的是,延时任务需要支持延时时间的增减,需要支持取消。

iohao commented 3 months ago

更多示例

// 伪代码如下
public void test() {
    // 创建轻量可控的延时任务,并设置任务监听回调,当延时任务触发时会执行该回调
    DelayTask delayTask = TaskKit.ofDelayTask(() -> log.info("hello DelayTask"))
                // N 秒后触发
                .addTime(Duration.ofSeconds(1))
                // 启动任务
                .task();

    delayTask.addTimeMillis(500); // 增加 0.5 秒的延时时间
    delayTask.addTimeMillis(-500); // 减少 0.5 秒的延时时间
    delayTask.cancel(); // 取消任务

    String taskId = delayTask.getTaskId(); // 得到当前 taskId(自动生成)

    TaskKit.cancelDelayTask(taskId); // 通过 taskId 取消任务,与 cancel 等价

    // --------------------------------------------------------
    // 创建轻量可控的延时任务,并设置 taskId 和任务监听回调。
    String newTaskId = "1";
    TaskKit.ofDelayTask(newTaskId,() -> log.info("hello DelayTask"))
                // 2.5 秒后触发
                .addTime(Duration.ofSeconds(2))
                .addTimeMillis(500)
                // 启动任务
                .task();

    // 在后续的业务中,可以通过 taskId 查找该延时任务
    Optional<DelayTask> optionalDelayTask = DelayTaskKit.optionalDelayTask(newTaskId);
    if (optionalDelayTask.isPresent()) {
        DelayTask delayTask = optionalDelayTask.get();
        log.info("{}", delayTask);
    }

    // 通过 taskId 查找延时任务,存在则执行给定逻辑
    DelayTaskKit.ifPresentDelayTask(newTaskId, delayTask -> {
        delayTask.addTimeMillis(500); // 增加 0.5 秒的延时时间
    });

}