diff --git a/HttpServer/Events/OnPipeMessage.php b/HttpServer/Events/OnPipeMessage.php index 89fa0b5d..3fa93a58 100644 --- a/HttpServer/Events/OnPipeMessage.php +++ b/HttpServer/Events/OnPipeMessage.php @@ -8,7 +8,9 @@ use Exception; use HttpServer\Abstracts\Callback; use Kafka\Struct; use Snowflake\Crontab\Crontab; +use Snowflake\Crontab\Producer; use Snowflake\Event; +use Snowflake\Snowflake; use Swoole\Server; /** @@ -48,6 +50,22 @@ class OnPipeMessage extends Callback throw new Exception('unknown handler'); } /** @var Crontab $handler */ + defer(function () use ($handler) { + $return = $handler->isRecover(); + if ($return === 999) { + $name = $handler->getName(); + + $redis = Snowflake::app()->getRedis(); + if ($redis->exists('stop:crontab:' . $name)) { + $redis->del('crontab:' . $name); + $redis->del('stop:crontab:' . $name); + } else { + $redis->set('crontab:' . $name, swoole_serialize($handler)); + $tickTime = time() + $handler->getTickTime(); + $redis->zAdd(Producer::CRONTAB_KEY, $tickTime, $name); + } + } + }); $handler->increment()->execute(); return 'success'; } diff --git a/System/Crontab/Crontab.php b/System/Crontab/Crontab.php index f4d96afe..b5935ef2 100644 --- a/System/Crontab/Crontab.php +++ b/System/Crontab/Crontab.php @@ -177,24 +177,6 @@ abstract class Crontab extends BaseObject } - /** - * @throws Exception - */ - private function recover(): bool - { - $redis = Snowflake::app()->getRedis(); - if ($redis->exists('stop:crontab:' . $this->getName())) { - $redis->del('crontab:' . $this->getName()); - $redis->del('stop:crontab:' . $this->getName()); - } else { - $redis->set('crontab:' . ($name = $this->getName()), static::getSerialize($this)); - $tickTime = time() + $this->getTickTime(); - $redis->zAdd(Producer::CRONTAB_KEY, $tickTime, $name); - } - return true; - } - - abstract public function process(): mixed; abstract public function max_execute(): mixed; @@ -233,7 +215,7 @@ abstract class Crontab extends BaseObject call_user_func([$this, 'max_execute'], ...$this->getParams()); return $redis->del('crontab:' . $this->getName()); } else { - return $this->recover(); + return 999; } } catch (\Throwable $throwable) { return logger()->addError($throwable, 'throwable');