場(chǎng)景:系統(tǒng)運(yùn)行依賴定時(shí)器,非硬依賴,restart會(huì)比較耗費(fèi)時(shí)間,設(shè)備數(shù)量逐步增大的情況下,對(duì)業(yè)務(wù)產(chǎn)生影響的時(shí)間越來(lái)越長(zhǎng),項(xiàng)目又必須進(jìn)行版本迭代,所以自己添加了onWorkerReload回調(diào),在gatewayworker中啟用熱加載,但reload會(huì)導(dǎo)致定時(shí)器丟失,所以我在onWorkerReload中重建定時(shí)器,但無(wú)法正常運(yùn)行
問(wèn)題現(xiàn)象:restart時(shí)定時(shí)器可以正常運(yùn)行,reload后原有定時(shí)器丟失,在onWorkerReload中重建定時(shí)器,重建過(guò)程無(wú)報(bào)錯(cuò),亦有ID返回,但是定時(shí)器并未工作,多次reload會(huì)一直返回同一個(gè)ID
不能動(dòng)態(tài)顯示gif動(dòng)圖啊,下面時(shí)部分代碼:
events.php
/**
* 進(jìn)程啟動(dòng)后初始化數(shù)據(jù)庫(kù)連接
*/
public static function onWorkerStart($worker)
{
//程序啟動(dòng)記錄日志
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);
}
/**
* 進(jìn)程重啟動(dòng)后初始化數(shù)據(jù)庫(kù)連接,重建定時(shí)器
*/
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
/**
* 周期定時(shí)器
*/
public function create_sender_timer($client_id)
{
Timer::add(3,function($client_id){
log_debug($client_id);
},[$client_id]);
}
onWorkerReload是收到reload信號(hào)后執(zhí)行的回調(diào),執(zhí)行完畢后進(jìn)程退出。
重建定時(shí)器應(yīng)該放到onWorkerStart里
噢,原來(lái)如此,我以為是進(jìn)程重啟后運(yùn)行onWorkerReload,原來(lái)執(zhí)行完畢后進(jìn)程退出了,謝謝老大