bsworker添加onWorkerReload,重建定时器不工作,求指点?

dangpengsong

场景:系统运行依赖定时器,非硬依赖,restart会比较耗费时间,设备数量逐步增大的情况下,对业务产生影响的时间越来越长,项目又必须进行版本迭代,所以自己添加了onWorkerReload回调,在gatewayworker中启用热加载,但reload会导致定时器丢失,所以我在onWorkerReload中重建定时器,但无法正常运行

问题现象:restart时定时器可以正常运行,reload后原有定时器丢失,在onWorkerReload中重建定时器,重建过程无报错,亦有ID返回,但是定时器并未工作,多次reload会一直返回同一个ID

543 2 0
2个回答

dangpengsong

不能动态显示gif动图啊,下面时部分代码:
events.php

/**
     * 进程启动后初始化数据库连接
     */
    public static function onWorkerStart($worker)
    {
        //程序启动记录日志
        self::$db    = new DB(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
        self::$redis = new Redis();
        self::$redis->pconnect(REDIS_HOST, REDIS_PORT) or die('connect failed');
        self::$redis->auth(REDIS_PASS) or die('confirm password failed');
        self::$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
        Timer::add(50, function ($db, $redis) {
            $db->query('select 1;');
            $redis->time();
        }, array(self::$db, self::$redis));
        self::$dotcontrol = new DotControl($worker->id, self::$db, self::$redis);
        // self::$appcontrol = new AppControl(self::$db, self::$redis);
        // self::$webcontrol = new WebControl(self::$db, self::$redis);
    }
    /**
     * 进程重启动后初始化数据库连接,重建定时器
     */
    public static function onWorkerReload($worker)
    {
        self::onWorkerStart($worker);
        foreach(Gateway::getClientIdListByGroup('worker::'.$worker->id) as $client_id){
            self::$dotcontrol->create_sender_timer($client_id);
        }
    }

dotcontrol.php

/**
     * 周期定时器
     */
    public function create_sender_timer($client_id)
    {
        Timer::add(3,function($client_id){
            log_debug($client_id);
        },[$client_id]);
    }
  • 暂无评论
walkor

onWorkerReload是收到reload信号后执行的回调,执行完毕后进程退出。
重建定时器应该放到onWorkerStart里

  • dangpengsong 2022-04-24

    噢,原来如此,我以为是进程重启后运行onWorkerReload,原来执行完毕后进程退出了,谢谢老大

年代过于久远,无法发表回答
🔝